【发布时间】:2020-09-02 06:47:48
【问题描述】:
我正在尝试从 Firebase 数据库中获取服务列表。这是我的参考:
let REF_SERVICES = DB_REF.child("services")
这是我的获取函数:
func fetchServices(completion: @escaping([Service]) -> Void) {
var services = [Service]()
REF_SERVICES.observe(.value) { (snapshot) in
for child in snapshot.children.allObjects as! [DataSnapshot] {
guard let dictionary = child.value as? [String : Any] else { return }
let title = child.key
let service = Service(title: title, dictionary: dictionary)
services.append(service)
}
}
completion(services)
}
这是 Service 结构:
enum ServiceStatus: Int {
case available
case busy
}
struct Service {
let title: String
var details: String?
var location: CLLocation?
var status: ServiceStatus!
init(title: String, dictionary: [String: Any]) {
self.title = title
if let details = dictionary["details"] as? String {
self.details = details
}
if let index = dictionary["status"] as? Int {
self.status = ServiceStatus(rawValue: index)
}
}
}
我不太了解完成处理程序和异步调用是如何工作的,所以我不知道如何让它工作。
这是我在 ViewController 中调用此函数的地方:
private var services: [Service]? {
didSet {
let addServiceController = AddServiceController()
addServiceController.services = self.services!
}
}
func fetchServices() {
Services.shared.fetchServices { (services) in
self.services = services
}
}
在两个 ViewController 中,数组都显示为空。我通过使用 print 语句来验证它是否正在获取数据,从而使用了调试的圣杯。
谢谢。
【问题讨论】:
-
我确信@arturdev 的回答是正确的。顺便说一句,我只是想知道您的 ViewController 的
services属性的didSet打算做什么?addServiceController是在didSet中创建的,这看起来有点奇怪。 :-) -
@KyokookHwang 我实例化它以访问该 ViewController 中的
services数组。尽管最好将HomeController中的那个设为静态以便能够在AddServiceController中访问