为什么在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()返回空的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)
        }
    }

}