如何解决使用Swift闭包和Firebase处理异步数据
我需要调用特定的Firebase参考并获取数据。该操作将在多个VC中进行,因此我想创建一个类,其中包含调用Firebase的各种函数。例如,如果要获取所有文章,则将调用FirebaseHelpers类,并使用方法/关闭 fetchArticles()。这样,如果我想重构某些东西,我只会在FirebaseHelpers类中完成它,而不会遍历所有VC。
FirebaseHelpers
import UIKit
import Firebase
class FirebaseHelpers {
func fetchArticles(completion: @escaping ([Article]?,Error?) -> Void) {
var articles = [Article]()
let articlesQuery = Database.database().reference().child("articles").queryOrdered(byChild: "createdAt")
articlesQuery.observe(.value,with: { (snapshot) in
guard let articlesDictionaries = snapshot.value as? [String : Any] else { return }
articlesDictionaries.forEach({ (key,value) in
guard let articleDictionary = value as? [String: Any] else { return }
// build articles array
let article = Article(dictionary: articleDictionary)
print("this is article within closure \(article)")
articles.append(article)
})
})
completion(articles,nil)
}
}
在任何viewController中
let firebaseHelpers = FirebaseHelpers()
var articles = [Article]() {
didSet {
self.collectionView.reloadData()
}
}
// this is inside viewDidLoad()
firebaseHelpers.fetchArticles { (articles,error) in
guard let articles = articles else { return }
print("articles \(articles)")
self.articles = articles
}
问题是我没有得到任何结果。在我的VC中,print(“ articles(articles”“))将返回一个 空数组 。但是在我的FirebaseHelpers fetchArticles()中,print(“这是闭包中的文章(文章)”)将打印文章 就好 。
知道为什么会这样吗?
谢谢。
解决方法
您可以在异步函数内移动completion
:
class FirebaseHelpers {
func fetchArticles(completion: @escaping ([Article]?,Error?) -> Void) {
var articles = [Article]()
let articlesQuery = Database.database().reference().child("articles").queryOrdered(byChild: "createdAt")
articlesQuery.observe(.value,with: { (snapshot) in
guard let articlesDictionaries = snapshot.value as? [String : Any] else { return }
articlesDictionaries.forEach({ (key,value) in
guard let articleDictionary = value as? [String: Any] else { return }
// build articles array
let article = Article(dictionary: articleDictionary)
print("this is article within closure \(article)")
articles.append(article)
})
completion(articles,nil) // <- move here
})
// completion(articles,nil) // <- remove
}
}
否则,将在异步函数之前调用completion
。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。