Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/103.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios Swift 3在集合视图中填写标签时出现不清楚的延迟_Ios_Swift_Uicollectionview_Swift3 - Fatal编程技术网

Ios Swift 3在集合视图中填写标签时出现不清楚的延迟

Ios Swift 3在集合视图中填写标签时出现不清楚的延迟,ios,swift,uicollectionview,swift3,Ios,Swift,Uicollectionview,Swift3,我正在从API读取产品数据并打印ID,以确保数据已成功获取。然后,我将产品标题放入集合视图标签中 奇怪的是,ID列表打印得非常快。然后应用程序等待几秒钟,直到collectionView被填充 我不明白为什么会发生延迟,因为我只有10个产品,这不应该需要任何时间来加载,我已经在它们上面做了一个循环,并在任何时间内成功地打印了ID 下面的代码正好显示了我所做的工作。我希望有人能帮我找出瓶子在哪里尼克: import UIKit class TestViewController: UIViewCo

我正在从API读取产品数据并打印ID,以确保数据已成功获取。然后,我将产品标题放入集合视图标签中

奇怪的是,ID列表打印得非常快。然后应用程序等待几秒钟,直到collectionView被填充

我不明白为什么会发生延迟,因为我只有10个产品,这不应该需要任何时间来加载,我已经在它们上面做了一个循环,并在任何时间内成功地打印了ID

下面的代码正好显示了我所做的工作。我希望有人能帮我找出瓶子在哪里尼克:

import UIKit

class TestViewController: UIViewController, UICollectionViewDataSource, UICollectionViewDelegate {
    @IBOutlet weak var collectionView: UICollectionView!

    var jsonData : [[String: Any]] = [[:]]

    override func viewDidLoad() {
        super.viewDidLoad()

        var request = URLRequest(url: URL(string: shopUrl + "/admin/products.json")!)
        request.httpMethod = "GET"

        URLSession.shared.dataTask(with:request, completionHandler: {(data, response, error) in
            if error != nil {
                print(error)
            } else {
                do {
                    guard let json = try? JSONSerialization.jsonObject(with: data!, options: .allowFragments) as? [String: Any] else { return }

                    guard let root = json?["products"] as? [[String: Any]] else { return }
                    self.jsonData = root
                    self.collectionView.reloadData()

                    print("This will be printed very fast!")

                    for product in root {
                        guard let id = product["id"] as? Int else { return }
                        print(id)
                    }
                }
            }
        }).resume()

    }

    func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        return self.jsonData.count
    }

    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
        let data = self.jsonData[indexPath.row]

        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "TestCollectionViewCell", for: indexPath) as!     TestCollectionViewCell

        if let title = data["title"] as? String {
            cell.titleLabel.text = title
        }

        return cell
    }
}

尝试在主线程中调用重新加载的数据:

DispatchQueue.main.async {
   self.collectionView.reloadData()
}

问题是,
URLSession
回调处理程序仍在后台线程中,因此它无法快速更新您的UI,因此您必须在使用
URLSession

更新呼叫网络请求后的任何UI之前切换回主线程,然后尝试在主线程中调用您的重新加载数据:

DispatchQueue.main.async {
   self.collectionView.reloadData()
}

问题是,
URLSession
回调处理程序仍然在后台线程中,因此它不会快速更新您的UI,因此您必须在使用
URLSession

更新呼叫网络请求后的任何UI之前切换回主线程,这是一个很好的解决方案!作为魅力解决!