Задать вопрос
@Shakedown

Swift, почему зависает UI?

Делаю приложение для скачивания фоток. Захожу на поиск, пишу запрос, начинается анимация загрузки, и 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()
    }
  • Вопрос задан
  • 132 просмотра
Подписаться 1 Простой 5 комментариев
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы