Индикатор активности в асинхронном режиме — Swift

У меня тяжелый код - асинхронная загрузка изображений. Я использую Grand Central Dispatch, но индикатор активности не работает. Помогите найти ошибку, пожалуйста

func loadImage() {
    if let imageUrl = NSURL(string: "http://\($url)/1.jpg") {
        let imageRequest: NSURLRequest = NSURLRequest(URL: imageUrl)
        let queue: NSOperationQueue = NSOperationQueue.mainQueue()
        NSURLConnection.sendAsynchronousRequest(imageRequest, queue: queue, completionHandler:{ (response: NSURLResponse!, data: NSData!, error: NSError!) -> Void in
            if data != nil {
                self.image = UIImage(data: data)!
                self.productImageView.image = self.image

            }
        })
    }
}


override func viewDidLoad() {
    super.viewDidLoad()

    self.imageActivityIndicator.startAnimating()
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), { () -> Void in

    self.loadImage()

    dispatch_async(dispatch_get_main_queue(), { () -> Void in
        self.imageActivityIndicator.stopAnimating()
    })
    });


}

person aXXy    schedule 09.08.2015    source источник


Ответы (1)


это происходит потому, что вы используете imageActivityIndicator в viewDidLoad, а представления еще не добавлены в основное представление, поэтому, если ваш код будет работать, если вы переместите его в функцию viewWillAppear.

Кроме того, вы должны скрыть его, когда изображение завершит загрузку, поэтому ваш код будет таким:

func loadImage() {
    if let imageUrl = NSURL(string: "http://skidon.info/1.jpg") {
        let imageRequest: NSURLRequest = NSURLRequest(URL: imageUrl)
        let queue: NSOperationQueue = NSOperationQueue.mainQueue()
        NSURLConnection.sendAsynchronousRequest(imageRequest, queue: queue, completionHandler:{ (response: NSURLResponse!, data: NSData!, error: NSError!) -> Void in
            if data != nil {

                self.image = UIImage(data: data)!
                self.productImageView.image = self.image

                dispatch_async(dispatch_get_main_queue(), { () -> Void in
                    self.imageActivityIndicator.stopAnimating()
                    self.imageActivityIndicator.hidden = true
                })

            }
        })
    }
}


override func viewWillAppear() {
    super.viewWillAppear()

    self.imageActivityIndicator.startAnimating()
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), { () -> Void in

        self.loadImage()

    });


}
person Firas    schedule 09.08.2015
comment
Спасибо! Итак, теперь я снова использую «imageActivityIndicator» в «viewDidLoad» и исправляю «dispatch_async(dispatch_get_main_queue()». И использую Hides When Stopped в раскадровке. Теперь это работает! Спасибо! - person aXXy; 10.08.2015