簡體   English   中英

Firebase通過嵌套數據循環並存儲在陣列中

[英]Firebase Loop through Nested Data and Store in Array

我正在嘗試將圖像網址列表保存到一個空字符串數組中,然后在集合視圖中顯示。 我在遍歷字典來存儲URL時遇到麻煩。

我在EncounterTableViewController.swift中獲取Firebase數據,然后有另一個具有EncounterCollectionViewCell.swift的詳細視圖控制器EncounterDetailViewController.swift。

遭遇迅捷

class Encounter {
    ...
    ...
    var images: [String] = []
}

EncounterTableViewController.swift

func showAllEncounters() {
    // Firebase tableview data
    FIRDatabase.database().reference().child("encounters").observeSingleEvent(of: .value, with: { (snapshot) in
        for rest in snapshot.children.allObjects as! [FIRDataSnapshot] {
            guard let restDict = rest.value as? [String: Any] else { continue }

            let encounter = Encounter()
            ...
            ...
            let mediaDict = restDict["media"] as! [[String:Any]]

            // need to find nested images and set them to encounter.images here

            self.encounters.append(encounter)

            self.tableView.reloadData()
        }
    })
}

EncounterDetailViewController.swift

private let reuseIdentifier = "imageCell"

class EncounterDetailViewController: UIViewController, 
UICollectionViewDataSource, UICollectionViewDelegate {

// MARK: - Properties
var selectedEncounter: Encounter?

// MARK: - View did load
override func viewDidLoad() {
    super.viewDidLoad()

}

    // MARK: - UICollectionViewDataSource
func numberOfSections(in collectionView: UICollectionView) -> Int {
    return 1
}

func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
    return (selectedEncounter?.images.count)!
}

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: reuseIdentifier, for: indexPath) as! EncounterCollectionViewCell

    cell.imageView.sd_setImage(with: URL(string: (selectedEncounter?.images[indexPath.row])!))

    return cell
}

遭遇數據結構

encounters
  -12
    -name: "shark"
    -length: "3"
    -media
      -0
        -id: "3242"
        -url: "http://google.com"
        -thumb-url: "http://thisurl.com"
      -1
        -id: "4252"
        -url: "http://google.com"
        -thumb-url: "http://thisurl.com"

代替for loop ,最簡單的解決方案是使用flatMap

let mediaDict = restDict["media"] as! [[String:Any]]
images = mediaDict.flatMap { $0["thumb_url"] as? String }

這種單行解決方案將減少您的for loop代碼,但是如果仍然想使用循環,則可以像這樣進行。

for media in mediaDict {
    if let url = media["thumb_url"] as? String {
        images.append(url)
    } 
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM