2016-09-22 3 views
0

Я читаю данные о продуктах из API и распечатываю идентификаторы, чтобы убедиться, что данные успешно получены. Затем я помещал названия продуктов в метку коллекции.Swift 3 нечеткая задержка при заполнении ярлыков в виде коллекции

Странно, что список идентификаторов печатается очень быстро. Затем приложение будет ждать несколько секунд до заполнения коллекции.

Я не мог понять, почему происходит задержка, поскольку у меня есть только 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 обработчик обратного вызова по-прежнему в фоновом потоке, так он не будет обновлять ваш пользовательский интерфейс быстро, поэтому вам нужно переключиться обратно в основной поток до обновления любого пользовательского интерфейса после запроса по сети с помощью URLSession

+0

Решенный как очарование! – Hamid

Смежные вопросы