2016-09-22 3 views
0

私はAPIから製品データを読み込み、IDを印刷してデータが正常に取り込まれたことを確認しています。次に、私は製品のタイトルをコレクションビューラベルに入れます。Swift 3コレクションビューでのラベルの塗り潰しが不明確

ここで奇妙なのは、IDのリストが非常に高速に印刷されていることです。その後、コレクションビューが表示されるまで数秒待つ。

私は10個の製品しか持っていないので、遅延が発生している理由を理解できませんでした。読み込みに時間がかかっていないはずです。

次のコードは、私がまだ行ったことを正確に示しています。

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

答えて

2

メインスレッドであなたのreloadDataを呼び出してみてください:

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

問題がURLSessionコールバックハンドラは、そのバックグラウンドスレッドにまだあるということです私は誰かがボトルニックがどこにあるか私が把握役立つことを願ってあなたのUIをすばやく更新する必要はありませんので、メインのスレッドに戻ってから、ネットワークリクエスト後にUIを更新する必要があります。URLSession

+0

魅力的に解決されました! – Hamid

関連する問題