2016-09-30 36 views
4

我在viewController中有一些默认图像,并且在用户操作之后,它会加载外部图像并替换默认图像。UIImage刷新swift3

的问题,它加载图像,但犯规刷新,除非我改变的viewController到另一个

DispatchQueue.main.async { 
      self.getDataFromUrl(thumbURL, completion: { (data) in 
         let image = UIImage(data: data!) 
         self.cityImageView.image = image 
         print("img refreshed") 
       }) 
      } 

func getDataFromUrl(_ url:String, completion: @escaping ((_ data: Data?) -> Void)) { 
     URLSession.shared.dataTask(with: URL(string: url)!, completionHandler: { (data, response, error) in 
      if let newData = data { 
       completion(newData) 
      } 
     }) .resume() 
    } 

,所以我得到一个打印出来img refreshed但在前端没有什么变化,我失去了什么?

回答

3

你能在主线上设置图像吗?

DispatchQueue.main.async { 
    self.getDataFromUrl(thumbURL, completion: { (data) in 
     DispatchQueue.main.async { 
      let image = UIImage(data: data!) 
      self.cityImageView.image = image 
      print("img refreshed") 
     } 
    }) 
} 
+0

感谢它的工作,但仍然不明白为什么双主线程? –

+0

这是正确的,但你可以删除第一个GCD主。我认为这个方法是在子线程中运行的。所以你只需在关闭中调用主线程。 – Stark

+0

我刚刚复制了你的代码,并把完成块放在主线程中,因为它涉及UIKit。我不知道你为什么需要第一次派遣。正如@stark所评论的,你可能不需要它。 –

0

您不必将其放入GCD队列中。

完成块将在委托队列中执行(在本例中为主队列)。只要注意你应该定义捕获列表以避免内存泄漏。

self.getDataFromUrl(imageURL, completion: { [unowned self] (data) in 
       let image = UIImage(data: data!) 
       self.imageView.image = image 
       print("img refreshed") 
      }) 

func getDataFromUrl(_ url:String, completion: @escaping ((_ data: Data?) -> Void)) { 

     URLSession.shared.dataTask(with: URL(string: url)!, completionHandler: { (data, response, error) in 
      if let newData = data { 
       completion(newData) 
      } 
     }) .resume() 
    } 

让我知道它是否解决了您的问题。