IOS - 从 Firebase 解析对象 - 下载完成前运行的代码

Posted

技术标签:

【中文标题】IOS - 从 Firebase 解析对象 - 下载完成前运行的代码【英文标题】:IOS - Parsing objects from Firebase - Code running before download is completed 【发布时间】:2016-09-02 18:47:36 【问题描述】:

我正在尝试将 Firebase 中的数据解析为对象数组,并在完成后显示数组中第一个对象的文本。但是,我无法解决/找到在下载完成之前停止代码继续运行的解决方案。因此它继续将用户的完成更新为 true,而不显示文本。这是函数,下载和附加到数组工作正常,但它在完成之前跳到 displayNextInSeries()...

    func parseSeries (ref: String)  
    FIRDatabase.database().reference().child("library").child("series").child(ref).observeSingleEvent(of: .value, with:   (snapshot)  in

        if let snapshot = snapshot.children.allObjects as? [FIRDataSnapshot] 

            for snap in snapshot 

                print(snap)

                if let pushSeriesDict = snap.value as? Dictionary<String, AnyObject> 
                    let key = snap.key
                    let push = PUSH_SERIES(pushKey: key, pushSeriesData: pushSeriesDict)
                    self.seriesArray.append(push)

                
            
        
    )

    print("\(ref) Series Count: \(self.seriesArray.count)")
    displayNextInSeries()


显示 next in series 函数看到 seriesArray.count = 0,所以它不会更新 texLbl:

   func displayNextInSeries() 

    if seriesProgress < seriesArray.count 

        animateProgress(current: seriesProgress, total: seriesArray.count)

        currentPUSH_SERIES = seriesArray[seriesProgress]
        currentPUSH_SERIES.text = personaliseText(text: currentPUSH_SERIES.text)

        textLbl.animateUpdate(currentPUSH_SERIES.text, oldText: previousText)
        titleLbl.text = "\(currentPUSH_SERIES.title!)"
        previousText = currentPUSH_SERIES.text

        seriesProgress += 1

     else 

        animateProgress(current: sessionProgress, total: sessionTarget)

        titleLbl.text = ""
        greetingPush()
        seriesPlay = false
        seriesProgress = 0

        user.updateProgress(seriesName)
        print(user.progress)


    


我可能在这里做一些根本错误的事情。非常需要您的帮助,非常感谢!谢谢,马特

【问题讨论】:

【参考方案1】:

observeSingleOfEvent是一个异步调用,调用completionBlock里面的函数就可以解决,问题是你的打印函数在observeSingleOfEvent完成下载数据之前就被调用了:-

func parseSeries (ref: String)  
FIRDatabase.database().reference().child("library").child("series").child(ref).observeSingleEvent(of: .value, with:   (snapshot)  in

    if let snapshot = snapshot.children.allObjects as? [FIRDataSnapshot] 

        for snap in snapshot 

            print(snap)

            if let pushSeriesDict = snap.value as? Dictionary<String, AnyObject> 
                let key = snap.key
                let push = PUSH_SERIES(pushKey: key, pushSeriesData: pushSeriesDict)
                self.seriesArray.append(push)
                print("\(ref) Series Count: \(self.seriesArray.count)")
                displayNextInSeries()
            
        
    
  )

【讨论】:

如果它解决了您的问题,请接受它作为答案:)快乐编码 谢谢 D。我只需要移动 displayNext 函数。谢谢你的回答:)

以上是关于IOS - 从 Firebase 解析对象 - 下载完成前运行的代码的主要内容,如果未能解决你的问题,请参考以下文章

Firebase iOS - 从其他视图控制器访问用户对象

(iOS + Firebase)无法将图像从 UITableViewCell 传递给下一个 ViewController

iOS:无法解析来自 firebase 的推送通知

使用 swiftyJSON/swift 从 Firebase 解析排行榜数据

长链接不可解析 - iOS 上的 Firebase 动态链接

iOS:如何从 Firebase 检索创建于/更新的时间戳?