Swift 在dataTask()方法完成之前调用func collectionView

Swift 在dataTask()方法完成之前调用func collectionView,swift,Swift,我调用我的Web服务来返回JSON数据,然后这些数据将用于填充UICollectionView中的单元格。为了确定单元格的数量,我计算JSON数组中返回的项的数量。但是,问题是在dataTask()函数完成之前调用了我的collectionView()函数(我猜dataTask()是异步的),这反过来会给我一个错误,详细说明我正在访问一个nil值(TestController.swift中的jsonCount变量)。我尝试过使用各种CompletionHandler和返回值,但无法使其工作。你们

我调用我的Web服务来返回JSON数据,然后这些数据将用于填充UICollectionView中的单元格。为了确定单元格的数量,我计算JSON数组中返回的项的数量。但是,问题是在dataTask()函数完成之前调用了我的collectionView()函数(我猜dataTask()是异步的),这反过来会给我一个错误,详细说明我正在访问一个nil值(TestController.swift中的jsonCount变量)。我尝试过使用各种CompletionHandler和返回值,但无法使其工作。你们能帮我指一下正确的方向吗

非常感谢您的帮助/意见

斯威夫特

class func getPostings(completionHandler: @escaping (_: Any) -> ()) {
        let url: URL = URL(string: "url")!
        let request: URLRequest = URLRequest(url: url)
        let task = URLSession.shared.dataTask(with: request) {data, 
                   response, error in
                guard error == nil else {
                print(error!)
                completionHandler("Failed")
                return
                }
        let httpResponse = response as! HTTPURLResponse
        let statusCode = httpResponse.statusCode

        if statusCode == 200 {
            let json = try? JSONSerialization.jsonObject(with: data!, options: .allowFragments) as! [[String: Any]]
            completionHandler(json!)
        }
    }
    task.resume()
TestController.swift

var jsonCount: Int?
var jsonData: [[String: Any]]?

override func viewDidLoad() {
    super.viewDidLoad()

    HomeModel.getPostings(completionHandler: {(response: Any) -> Void in
        guard response as? String != "Failed" else {
            //Code to send a pop-up alert to the user
            return
        }
        self.jsonData = response as? [[String: Any]]
        self.jsonCount = (self.jsonData?.count)!
    })
}

func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
    return jsonCount
}

CollectionView
TableView
默认情况下在
ViewDidLoad
方法上重新加载。但当你们从服务器下载一些东西,然后在主线程上完成下载任务更新UI

HomeModel.getPostings(completionHandler: {(response: Any) -> Void in
        guard response as? String != "Failed" else {
            //Code to send a pop-up alert to the user
            return
        }
        self.jsonData = response as? [[String: Any]]
        self.jsonCount = (self.jsonData?.count)!
        DispatchQueue.main.async {
            // Update UI on Main Thread
            collectionView.reloadData()
        }
    })

成功了,非常感谢!!真的很感激!