下载的图像并不总是立即显示

Posted

技术标签:

【中文标题】下载的图像并不总是立即显示【英文标题】:Downloaded image doesn't always show up immediately 【发布时间】:2017-01-12 10:03:30 【问题描述】:

由于某种原因,我的 photoimg 不会持续更新,有时会,有时不会。

我很确定它与异步调用有关,但我一直在试图找出它不更新的根本原因。因此,这是在我的 mainVC 中,对于用户上传/更新图像,他们会转到 settingsVC,当他们返回时,有时会显示更新后的图像,有时仍显示旧图像,有时什么也不显示。但奇怪的是,如果我点击我的设置并关闭它,那么图像将显示更新。

所以我认为我的问题在于我在哪里调用我的方法和我的异步队列。

func fetchProfileImage() 

    Dataservice.dataService.USERS_REF_CURRENT_PROFILE_IMAGE.downloadURL  (url, error) in
        if error != nil      
        
        else 

            let url = url?.downloadURL

            URLSession.shared.dataTask(with: url!, completionHandler:  (data, resonse, error) in
                if error != nil 
                    print("Fetching did not download \(error.debugDescription)")

                

                if let data = data 
                    print("Fetching Image did download data")

                    DispatchQueue.main.async 
                        self.profilePhoto.image = UIImage(data: data)
                    
                
            ).resume()
        
    

【问题讨论】:

能否请您发布日志。 (同时在空错误情况下打印)。 【参考方案1】:

为什么不直接使用内置的下载机制,它总是在主线程上呈现回调*:

let image: UIImage!
let ref = FIRStorage.storage().reference(forURL: Dataservice.dataService.USERS_REF_CURRENT_PROFILE_IMAGE)
ref.data(withMaxSize: 1 * 1024 * 1024)  data, error in
  if let error = error 
    // Uh-oh, an error occurred!
   else 
    // Data for your profile image is returned
    image = UIImage(data: data!)
  

*除非您通过提供自己的队列来明确更改线程;)

【讨论】:

我也尝试过这个概念,但仍然得到图像加载的不一致。发生的情况是我在设置图像之前打印出返回的 Imaged 但有时没有设置我的猜测是它在我调用我的方法或线程的位置之间。【参考方案2】:

执行异步后,需要回到主线程设置下载图像

DispatchQueue.main.async 
  DispatchQueue.main.sync 
    self.profilePhoto.image = UIImage(data: data)
  

【讨论】:

OP 已经在使用DispatchQueue.main.async 来更新主线程上的 UI。 这只是让我的程序崩溃了@rudydydy 你在哪里调用 fetchProfileImage() 方法 我在 viewDidappear 中调用它,但我尝试调用所有 viewWillAppear 并且 didLoad 仍然不一致

以上是关于下载的图像并不总是立即显示的主要内容,如果未能解决你的问题,请参考以下文章

为啥 QSplashscreen 并不总是有效?

PHP mail() - 图像并不总是加载

React 状态更改并不总是适用于移动网络

UIImageView 并不总是显示

如何显示尚未完全加载的图像的缩略图

在Qt中单击图像时尝试立即显示用户编辑操作的结果