1
我试图从observeSingleEvent
获得某个名为City的子节点,但我在试图将其拉入主线程中时出现问题。我使用了完成处理程序和调度调用的组合,但我不确定我在做什么错误,除了在异步方面没有那么好。在viewDidLoad
我试图从setupSavedLocations
函数追加我的密钥,并将它返回给savedLocations
我觉得我很接近。我错过了什么?不知道如何在异步调用之外追加数组
编辑:净度上的问题
import UIKit
import Firebase
class SavedLocationsViewController: UIViewController {
var userID: String?
var savedLocations: [String] = []
override func viewDidLoad() {
super.viewDidLoad()
setupSavedLocations() { (savedData) in
DispatchQueue.main.async(execute: {
self.savedLocations = savedData
print("inside", self.savedLocations)
})
}
print("outside",savedLocations)
}
func setupSavedLocations(completion: @escaping ([String]) ->()) {
guard let user = userID else { return }
let databaseRef = Database.database().reference(fromURL: "https://************/City")
var dataTest : [String] = []
databaseRef.observeSingleEvent(of: .value, with: {(snapshot) in
let childString = "Users/" + user + "/City"
for child in snapshot.children {
let snap = child as! DataSnapshot
let key = snap.key
dataTest.append(key)
}
completion(dataTest)
})
}
样本输出
outside []
inside ["New York City", "San Francisco"]
您的代码没有显示任何错误。无论如何,只需稍加观察,您可能需要在'main.async'前面指定'savedLocations':'self.savedLocations = savedData DispatchQueue.main.async'中的setupSavedLocations(){(savedData),然后如果需要刷新一些组件,例如:'UITableView',你必须在'main.async'里面执行它 –
在main.async之外有什么理由?这是否意味着无法在主线程上使用我的savedLocation? – LampPost
你的意思是“试图将其拉入主线程的问题”?如果您引用的是“外部”打印语句未列出位置,那是因为它在setupSavedLocations完成之前正在调用。它是异步的,所以它在运行时不会阻止你的viewDidLoad。 – ghostatron