2015-08-09 4 views
0

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

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() 
    }) 
    }); 


} 

ответ

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() 

    }); 


} 
+0

Спасибо! Итак, теперь я снова использую «imageActivityIndicator» в «viewDidLoad» и исправляю «dispatch_async (dispatch_get_main_queue()». И используйте ** Hides When Stopped ** в раскадровке. Теперь это работа! Спасибо! – aXXy