swift - func collectionView 在 dataTask() 方法完成之前被调用

标签 swift

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

非常感谢您的帮助/意见。

HomeModel.swift

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

测试 Controller .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
}

最佳答案

CollectionViewTableView 默认情况下在 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()
        }
    })

关于swift - func collectionView 在 dataTask() 方法完成之前被调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43697340/

相关文章:

ios - Facebook 分享链接和屏幕截图的问题

json - 如何使用 swift 4.1 codable(json 解码)过滤无效数据

ios - 更改 Root View Controller 不会在同一窗口上释放以前的 View Controller

swift - 如何在 swift 中运行 shell 命令?

swift - 比较今天和过去的日期

ios - 目前无法在 Xcode 模拟器中安装此应用

ios - Swift:如何让我游戏中的角色只有在落地后才能跳跃?

ios - Geofire查询距离的精度是多少?

swift - 用户默认值中的 Firebase ID

swift - 为什么 Dictionary.map 返回一个元组数组,它​​在哪里记录?