Ios 为什么第一次在viewDidLoad()中打印空数组而不是附加值的数组?
我希望在viewDidLoad()中有一个附加了数据库值的数组,以便在加载视图后提取一个值并将其分配给UILabel.text 代码:Ios 为什么第一次在viewDidLoad()中打印空数组而不是附加值的数组?,ios,arrays,swift,viewdidload,Ios,Arrays,Swift,Viewdidload,我希望在viewDidLoad()中有一个附加了数据库值的数组,以便在加载视图后提取一个值并将其分配给UILabel.text 代码: var tagArr = [Tag]() override func viewDidLoad() { super.viewDidLoad() let AA = fetchTagPool() print(AA)
var tagArr = [Tag]()
override func viewDidLoad() {
super.viewDidLoad()
let AA = fetchTagPool()
print(AA)
}
func fetchTagPool() -> [Tag]{
API.Tag.observeTagPool {(tag) in
self.tagArr.append(tag)
print(self.tagArr)
}
return self.tagArr
}
print(AA)
的结果是一个空数组,如[]
,而print(self.tagArr)
的结果是附加了数据库值的预期数组
如何修复代码以使print(AA)
像print(self.tagArr)
那样工作
非常感谢对
API.Tag.observeTagPool
的调用是异步的,它将在fetchTagPool()
返回空的self.tagArr
后完成
您需要更改fetchTagPool
以通过回调
函数返回值,如下所示:
override func viewDidLoad() {
super.viewDidLoad()
// Note: This will print AA after viewDidLoad finishes
// Use trailing closure syntax to pass the trailing closure
// as "callback". Then fetchTagPool calls "callback", this
// closure will receive the value as AA and print it and
// update the UILabel
fetchTagPool() { AA in
print(AA)
// Use value to update a label
myLabel.text = AA[0].name
}
print("This will print first")
}
func fetchTagPool(callback: ([Tag]) -> Void) {
API.Tag.observeTagPool { tag in
self.tagArr.append(tag)
print(self.tagArr)
callback(self.tagArr)
}
}
func fetchTagPool(callback: ([Tag]) -> Void) {
API.Tag.observeTagPool { tag in
DispatchQueue.main.async {
self.tagArr.append(tag)
print(self.tagArr)
callback(self.tagArr)
}
}
}
如果
API.Tag.observeTagPool
在后台队列上运行,并且没有返回到主队列以返回其值,则在更新属性中的值之前,应先移动到主队列,如下所示:
override func viewDidLoad() {
super.viewDidLoad()
// Note: This will print AA after viewDidLoad finishes
// Use trailing closure syntax to pass the trailing closure
// as "callback". Then fetchTagPool calls "callback", this
// closure will receive the value as AA and print it and
// update the UILabel
fetchTagPool() { AA in
print(AA)
// Use value to update a label
myLabel.text = AA[0].name
}
print("This will print first")
}
func fetchTagPool(callback: ([Tag]) -> Void) {
API.Tag.observeTagPool { tag in
self.tagArr.append(tag)
print(self.tagArr)
callback(self.tagArr)
}
}
func fetchTagPool(callback: ([Tag]) -> Void) {
API.Tag.observeTagPool { tag in
DispatchQueue.main.async {
self.tagArr.append(tag)
print(self.tagArr)
callback(self.tagArr)
}
}
}