为什么在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)
        }
    }

}