问题描述
我想在viewDidLoad()中添加一个数组,该数组中附加了数据库中的值,以便可以在加载视图后提取一个值并将其分配给UILabel.text。
代码:
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
才能通过callback
函数返回值,如下所示:
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)
}
}
如果您的API.Tag.observeTagPool
在后台队列上运行并且没有返回主队列以返回其值,则应在更新属性中的值之前移至主队列,如下所示:
func fetchTagPool(callback: ([Tag]) -> Void) {
API.Tag.observeTagPool { tag in
DispatchQueue.main.async {
self.tagArr.append(tag)
print(self.tagArr)
callback(self.tagArr)
}
}
}