Ios 下载的图像不';I don’我不总是立刻出现

Ios 下载的图像不';I don’我不总是立刻出现,ios,swift,firebase,firebase-storage,Ios,Swift,Firebase,Firebase Storage,由于某些原因,我的照片不会持续更新,有时会,有时不会 我很确定它与异步调用有关,但我一直在努力找出它不更新的根本原因。这是在我的mainVC中,用户上传/更新图像时,他们会进入设置SVC,当他们返回时,有时会显示更新后的图像,有时仍显示旧图像,有时则不显示任何内容。但奇怪的是,如果我点击我的设置并关闭它,那么图像将显示更新 所以我认为我的问题在于调用方法和异步队列的位置 func fetchProfileImage() { Dataservice.dataService.USERS_R

由于某些原因,我的照片不会持续更新,有时会,有时不会

我很确定它与异步调用有关,但我一直在努力找出它不更新的根本原因。这是在我的mainVC中,用户上传/更新图像时,他们会进入设置SVC,当他们返回时,有时会显示更新后的图像,有时仍显示旧图像,有时则不显示任何内容。但奇怪的是,如果我点击我的设置并关闭它,那么图像将显示更新

所以我认为我的问题在于调用方法和异步队列的位置

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

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

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

为什么不使用内置下载机制,它总是在主线程上显示回调*:

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

*除非通过提供自己的队列显式更改线程;)

OP已经在使用
DispatchQueue.main.async
更新主线程上的UI。这只会使我的程序@rudydydywhere你调用fetchProfileImage()方法我在ViewDidDisplay中调用它,但我尝试在所有ViewWillDisplay中调用,但加载仍然不一致。请发布日志。(同时在空的错误案例中添加一个打印)。我也尝试了这个概念,但仍然得到图像加载的不一致性。发生的情况是,我打印了在设置图像之前返回的Imaged,但有时不设置,我猜是在调用方法或线程的位置之间。