2015-08-09 2 views
0

J'ai des images lourdes chargées en code de manière asynchrone. I am using Grand Central Dispatch, mais l'indicateur d'activité ne fonctionne pas. Aidez-moi à trouver l'erreur, s'il vous plaîtActivityIndicator en asynchrone - 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() 
    }) 
    }); 


} 

Répondre

1

ça se passe parce que vous utilisez le imageActivityIndicator dans viewDidLoad et les vues ont pas encore été ajouté à la vue principale, donc si votre code ne fonctionnera que si vous le déplacez viewWillAppear fonction.

Plus vous avez de le cacher lorsque l'image a terminé le chargement, donc cela rend votre code comme ceci:

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

Merci! Donc, maintenant j'utilise de nouveau le 'imageActivityIndicator' dans 'viewDidLoad' et je fixe 'dispatch_async (dispatch_get_main_queue()'.) Et j'utilise ** Hides When Stopped ** dans le storyboard. – aXXy