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