为什么在viewDidLoad()中第一次打印的是空数组而不是附加值的数组?
Why it print out an empty array instead of the array appended with values for the first time in viewDidLoad()?
我想在 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()
return 编辑空 self.tagArr
后完成。
您需要通过 callback
函数将值 fetchTagPool
更改为 return,如下所示:
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
在后台队列上运行并且没有 return 到主队列以 return 它的值,您应该在更新值之前移动到主队列在你的 属性 中像这样:
func fetchTagPool(callback: ([Tag]) -> Void) {
API.Tag.observeTagPool { tag in
DispatchQueue.main.async {
self.tagArr.append(tag)
print(self.tagArr)
callback(self.tagArr)
}
}
}
我想在 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()
return 编辑空 self.tagArr
后完成。
您需要通过 callback
函数将值 fetchTagPool
更改为 return,如下所示:
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
在后台队列上运行并且没有 return 到主队列以 return 它的值,您应该在更新值之前移动到主队列在你的 属性 中像这样:
func fetchTagPool(callback: ([Tag]) -> Void) {
API.Tag.observeTagPool { tag in
DispatchQueue.main.async {
self.tagArr.append(tag)
print(self.tagArr)
callback(self.tagArr)
}
}
}