首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >无法访问快速闭包内的变量

无法访问快速闭包内的变量
EN

Stack Overflow用户
提问于 2019-12-23 02:40:13
回答 2查看 101关注 0票数 0

我正在尝试将我的firebase数据库数据放入一个变量中,以便在项目中使用它

代码语言:javascript
运行
复制
var someArray = [Array]()
let dbRef = Database.database().reference().child("SomeDatabase")


func loadSomeDatabaseData {
   dbRef.observeSingleEvent(of: .value) { (snapshot) in
       let someDict = snapshot.value as! [String:Any]
       let keysOfSomeDict = Array(someDict.keys)
       self.someArray.append(contentsOf: keysOfSomeDict)
       self.collectionView?.reloadData()
   }
}

我尝试在viewDidload中调用loadSomeDatabaseData(),然后打印someArray,结果是一个空数组。我知道keysOfSomeDict数组有我想要的正确数据,因为我尝试在闭包中直接打印这个数组。然而,我也希望能够在我的应用程序中的其他地方打印和使用这些数据。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-12-23 14:06:15

Firebase的observeSingleEvent方法是asynchronous方法。它仅在后台执行,因为从Firebase获取数据需要时间。

如果你立即打印数组意味着你只能得到空数组。

所以一旦你从Firebase得到数据就打印数组。为此,您可以使用escaping closure

函数声明:

代码语言:javascript
运行
复制
  func loadSomeDatabaseData(resultArray : @escaping([Array])->()) {
       dbRef.observeSingleEvent(of: .value) { (snapshot) in
           let someDict = snapshot.value as! [String:Any]
           let keysOfSomeDict = Array(someDict.keys)
           self.someArray.append(contentsOf: keysOfSomeDict)
           resultArray(self.someArray)
       }
    }

函数调用:

代码语言:javascript
运行
复制
self.loadSomeDatabaseData{(firebaseReposne) in
   print("FirebaseData" , firebaseReposne)  // Hope here you will get your firebase data.
     self.collectionView?.reloadData()
}
票数 0
EN

Stack Overflow用户

发布于 2019-12-23 02:48:48

observeSingleEvent是异步的。因此,在调用loadSomeDatabaseData之后立即打印someArray将导致空数组。从Firebase api检索数据需要一些时间。

要在应用程序中的其他位置使用此数据,您可以设置一个指示数据已加载的标志,或发送通知以通知数据可用。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59447083

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档