[Solved] Why it print out an empty array instead of the array appended with values for the first time in viewDidLoad()?

[ad_1]

The call to API.Tag.observeTagPool is asynchronous and it will finish after fetchTagPool() has returned the empty self.tagArr.

You need to change fetchTagPool to return the value through a callback function like this:

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

}


If your API.Tag.observeTagPool runs on a background queue and doesn’t return to the main queue to return its value, you should move to the main queue before updating the value in your property like this:

func fetchTagPool(callback: ([Tag]) -> Void) {
      
    API.Tag.observeTagPool { tag in
        DispatchQueue.main.async {
            self.tagArr.append(tag)
            print(self.tagArr)
            callback(self.tagArr)
        }
    }

}

0

[ad_2]

solved Why it print out an empty array instead of the array appended with values for the first time in viewDidLoad()?