Делаю приложение для скачивания фоток. Захожу на поиск, пишу запрос, начинается анимация загрузки, и UI становится неотзывчивым. Все приходит в норму после загрузки картинок.
Все обновления UI происходят на main потоке, остальные вычисления - на других потоках
Это API manager:
func loadImages(searchingImage: String, page: Int, completion: @escaping (SearchCodable?, Error?) -> Void) {
DispatchQueue.global(qos: .background).async {
let session = URLSession(configuration: self.configuration)
let urlString = self.baseUrl + self.pixabayApiKey + "&q=\(searchingImage)" + "&page=\(page)" + "&per_page=9"
guard let imageURL = URL(string: urlString) else {
completion(nil, nil)
return
}
var request = URLRequest(url: imageURL)
request.cachePolicy = .reloadIgnoringLocalCacheData
request.httpMethod = "GET"
let dataTask = session.dataTask(with: request) { data, response, error in
if let data = data {
let searchingCodable = try? JSONDecoder().decode(SearchCodable.self, from: data)
completion(searchingCodable, error)
} else {
completion(nil, error)
}
}
dataTask.resume()
}
}
Это метод, который инкапсулирует менеджер:
private func loadImages() {
let spinner = createSpinnerFooter()
DispatchQueue.main.async {
self.view.addSubview(spinner)
}
networkService.loadImages(searchingImage: searchingImage!, page: page) { [weak self] response, error in
if let response = response {
for hit in response.hits {
let wallpaperImage: WallpaperImage = (self?.converter.convertToImage(hit: hit))!
self?.images.append(wallpaperImage)
}
DispatchQueue.main.async {
self?.collectionView.reloadData()
spinner.removeFromSuperview()
}
self?.isLoading = false
} else {
print(error as Any)
}
}
}
Далее вызов этого метода:
@objc private func didTapSearch() {
guard let searchingText: String = searchingTextField.text?.trimmingCharacters(in: .whitespaces) else { return }
images = []
searchingImage = searchingText
loadImages()
searchingTextField.resignFirstResponder()
}