Ios 为什么第一次在viewDidLoad()中打印空数组而不是附加值的数组?

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)

我希望在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
以通过
回调
函数返回值,如下所示:

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)
        }
    }

}