Как предотвратить быстрое зависание пользовательского интерфейса? - PullRequest
1 голос
/ 01 июля 2019

Я получаю некоторые данные с сервера при использовании URLSession в приведенном ниже коде. Когда я использую этот статический метод в коде, чтобы получить данные в каком-то другом контроллере представления (я имею в виду загрузочный метод, который я имею в виду), чтобы заполнить представление коллекции, мой пользовательский интерфейс останавливается на 2 секунды, что, я думаю, не должно быть так. где моя ошибка?

 class RelatedData{
    static func get(_ Url:String?,completion:@escaping (Array<Game>,Int)-> Void){
    guard let url = Url else{
        return
    }
    var request = URLRequest(url: URL(string:url  )!)
    var gameArray = [Game]()
    var status:Int!
    request.httpMethod = "GET"

    let task = URLSession.shared.dataTask(with: request) { data, response, error in
        guard let data = data, error == nil else {                                                 // check for fundamental networking error
            print("error=\(String(describing: error))")
            return
        }
        if let httpStatus = response as? HTTPURLResponse, httpStatus.statusCode != 200 {              // check for http errors
            print("statusCode should be 200, but is \(httpStatus.statusCode)")
            print("response = \(String(describing: response))")
        }
        do{
            print("Here we are in related games")
            let allData = try  JSONDecoder().decode(RelaedGameObject.self, from: data)
            status = allData.status
            gameArray = allData.data
            DispatchQueue.main.async{
                let container = gameArray
                completion(container,status)
                gameArray.removeAll()
            }
        }
        catch{
            print(" Related Api Don't Work!!!")
        }
    }
    task.resume()
}

}


//And This Is View Controller Call :  


RelatedData.get(url){(Games,status) in
   if status == 1{      
    self.relatedGames = Games
    if Games.count == 0 {
     self.label.font = UIFont(name: "IRANSans", size: 13)
     self.relatedCollectionView.backgroundView = self.label
     self.relatedLabel.isHidden = false  
    }else{
      self.relatedLabel.isHidden = false
      self.relatedCollectionView.isHidden = false
      self.relatedCollectionView.reloadData()
      self.relatedCollectionView.transform =CGAffineTransform(scaleX: -1.0, y: 1.0)
     self.relatedActivityIndicator.stopAnimating()
}
}else{
print("Err in related games")
   }
  }
}

Ответы [ 2 ]

1 голос
/ 01 июля 2019

Завершение должно быть в главном потоке, после этого вы можете обновить интерфейс.

Добавить DispatchQueue.main.async для плохого или печального пути ( поймать блоков или вернуть случаев)

Примечание. Если вы печатаете огромный ответ, это приводит к зависанию xcode и приложения.

0 голосов
/ 01 июля 2019

Вместо добавления вызова к DispatchQueue.main.async в do-catch выражении метода get(_:completion:), переместите его в controller, где вы получите ответ в обработчике completion, т.е.

RelatedData.get(url){(Games,status) in
    DispatchQueue.main.async {
        //add your code here...
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...