【问题标题】:getting data out of a closure that retrieves data from firebase从从 firebase 检索数据的闭包中获取数据
【发布时间】:2016-11-16 18:51:17
【问题描述】:

我正在尝试从 Firebase 检索数据并将该数据存储在检索该数据的闭包之外。

    var stringNames = [String] ()
    ref?.observeEventType(.Value, withBlock: { snapshot in
        var newNames: [String] = []
        for item in snapshot.children {
            if let item = item as? FIRDataSnapshot {
                let postDict = item.value as! [String: String]
                newNames.append(postDict["name"]!)
            }
        }
        stringNames = newNames
    })
    print(stringNames)

stringNames 返回为空,但是当我从闭包内部打印时,它具有正确的数据。任何帮助将不胜感激,谢谢!

【问题讨论】:

    标签: ios swift firebase closures firebase-realtime-database


    【解决方案1】:

    这是因为当您从 Firebase 获取数据时,调用是异步的。你可以做什么:

    选项 1 - 在闭包内设置逻辑(就像在闭包内打印 var 一样)。

    选项 2 - 定义您自己的闭包来接收您的数据,例如:

    func myMethod(success:([String])->Void){
    
        ref?.observeEventType(.Value, withBlock: { snapshot in
            var newNames: [String] = []
            for item in snapshot.children {
                if let item = item as? FIRDataSnapshot {
                    let postDict = item.value as! [String: String]
                    newNames.append(postDict["name"]!)
                }
            }
            success(newNames)
        })
    }
    

    选项 3 - 使用委托模式

    protocol MyDelegate{
         func didFetchData(data:[String])
    }
    
    class MyController : UIViewController, MyDelegate{
    
        func myMethod(success:([String])->Void){
            ref?.observeEventType(.Value, withBlock: { snapshot in
               var newNames: [String] = []
               for item in snapshot.children {
                   if let item = item as? FIRDataSnapshot {
                       let postDict = item.value as! [String: String]
                       newNames.append(postDict["name"]!)
                   }
                }
                self.didFetchData(newNames)
            })
        }
    
        func didFetchData(data:[String]){
            //Do what you want
        }
    
    }
    

    【讨论】:

    • 委托模式非常适合我想要处理的数据,谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多