iOS - UIActivityIndicatorView не останавливается - PullRequest
0 голосов
/ 10 октября 2018

Я запускаю UIActivityIndicatorView в функции и хочу остановить его в случае успеха, по какой-то причине это не происходит:

func imageCaller(url: String , success: @escaping (UIImage) -> Void, failure: @escaping () -> Void) {
    self.imageLoaderIndicator.startAnimating()

    let handler = AuthenticateHandler()
     self.urlSession = URLSession(configuration: URLSessionConfiguration.default, delegate: handler, delegateQueue: OperationQueue.main)
    self.imageThumbnailTask = urlSession?.dataTask(with: URL(string:url)!) { data, res, err in

        if err != nil {
            guard let dataResponse = data,
                err == nil else {
                    print("error from dataResponse:\(err?.localizedDescription ?? "Response Error")")
                    return

        }

        if let imageData = data {
            if let image = UIImage(data: imageData) {
                success(image)
            }
        }
    }
    self.imageThumbnailTask?.resume() 
 }

приведенный выше код является сетевым вызовом.

Этотвызывает метод:

func imageThumbnailcall() {
    self.imageCaller( url: self.isShowingThermal ? self.thermalUrl : self.visualUrl, success: { (image) in
            self.imageLoaderIndicator.stopAnimating()
            self.backGroundImageView.image = image
            if self.isInVC {
            self.imageThumbnailcall()
            }
    }) {
        self.imageLoaderIndicator.stopAnimating()
    }
  } 

Также в раскадровке я проверил «скрыть при остановке», а также попытался обернуть его в DispatchQueue.main.async {}

Ответы [ 3 ]

0 голосов
/ 10 октября 2018

В вашей функции много ветвей, которые не вызывают блоки success или failure, и вам также необходимо остановить индикатор активности в обратном вызове failure.Также следует убедиться, что вы отправляете все связанные с пользовательским интерфейсом действия в основной поток.

func imageCaller(url: String , success: @escaping (UIImage) -> Void, failure: @escaping () -> Void) {
    self.imageLoaderIndicator.startAnimating()

    let handler = AuthenticateHandler()
    self.urlSession = URLSession(configuration: URLSessionConfiguration.default, delegate: handler, delegateQueue: OperationQueue.main)
    self.imageThumbnailTask = urlSession?.dataTask(with: URL(string:url)!) { data, res, err in

        if err != nil {
            guard let dataResponse = data, err == nil else {
                print("error from dataResponse:\(err?.localizedDescription ?? "Response Error")")
                failure()
                return
            }
            do{
                //here dataResponse received from a network request
                let jsonResponse = try JSONSerialization.jsonObject(with: dataResponse, options: [])
                print("erro after parsing data:\(jsonResponse)") //Response result
                failure()
            } catch let parsingError {
                failure()
                print("Error", parsingError)
            }
        } else if let imageData = data, let image = UIImage(data: imageData) {
            success(image)
        } else {
            failure()
        }
    }
    self.imageThumbnailTask?.resume()
}

И затем также вызываете stopAnimating из блока failure:

func imageThumbnailcall() {
    self.imageCaller(url: self.isShowingThermal ? self.thermalUrl : self.visualUrl, success: { image in
        DispatchQueue.main.async{
            self.imageLoaderIndicator.stopAnimating()
            self.backGroundImageView.image = image
        }
        if self.isInVC {
            self.imageThumbnailcall()
        }
    }, failure: { _ in
        DispatchQueue.main.async{
            self.imageLoaderIndicator.stopAnimating()
        }
    })
}

Не уверен, что такое isInVC или как он установлен, но вы вызываете тот же метод снова на основе его значения, что может привести к бесконечному циклу imageThumbnailcall, вызывающему себя из обработчика успешного завершения.

0 голосов
/ 10 октября 2018

Обратный вызов URLSession.dataTask находится в фоновой очереди, поэтому

DispatchQueue.main.async { 
   self.imageLoaderIndicator.stopAnimating()
}

и убедитесь, что обрабатывает как успех, так и сбой

0 голосов
/ 10 октября 2018

Попробуйте;

func imageThumbnailcall() {
        self.imageCaller( url: self.isShowingThermal ? self.thermalUrl : self.visualUrl, success: { (image) in
                self.imageLoaderIndicator.stopAnimating()
                self.backGroundImageView.image = image
                if self.isInVC {
                self.imageThumbnailcall()
                }
        }) {
           self.imageLoaderIndicator.stopAnimating()
        }
      }
...