UIImage 刷新 Swift 3.0

4

我在视图控制器中有一些默认图片,在用户操作之后,它会加载外部图片并替换默认图片。

问题在于,它会加载图片,但如果不切换到其他视图控制器,它就不会更新。

  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 但在前端没有任何变化,我错过了什么吗?

2个回答

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")
        }
    })
}

谢谢,它可以工作了,但我仍然不明白为什么需要双主线程? - Özgür Ersil
没错,但你可以删除第一个GCD main。我认为这个方法在子线程中运行,所以你只需要在闭包中调用主线程。 - Stark
我只是复制了你的代码,并将完成块放在主线程中,因为它涉及UIKit。我不知道你为什么需要第一个调度。就像@stark评论的那样,你可能不需要它。 - Joe Smith

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

请告诉我它是否解决了你的问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接