2017-01-12 9 views
0

По какой-то причине мой фотолимп не обновляется постоянно, иногда иногда это не так.Скачано изображение не всегда отображается сразу

Я уверен, что это как-то связано с асинхронными вызовами, но я застрял, пытаясь выяснить причину, почему его не обновляют. Таким образом, это в моем 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() 
     } 
    } 
} 
+0

C пожалуйста, напишите журнал. (Также поместите печать в пустой случай ошибки). – shallowThought

ответ

-3

после выполнения асинхр, вам нужно вернуться к главной теме, чтобы установить загрузку изображения

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

OP уже использует 'DispatchQueue.main.async' для обновления пользовательского интерфейса в основном потоке. –

+0

Так что мне нужно позвонить ему дважды? по обоим нитям –

+0

Это ничего не делало, кроме аварии моей программы @rudydydy –

0

Почему бы просто не использовать встроенный в механизм загрузки, который всегда представляет обратные вызовы на главном потоке * :

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

*, если явно не изменить поток, обеспечивая собственную очередь;)

+0

Ive пробовал эту концепцию, но все же получаю несогласованность загрузки изображений. Что происходит, так это то, что я распечатываю Imaged, возвращенный прямо перед установкой изображения, но иногда не получается установить, что моя догадка - это между тем, где я вызываю свой метод или потоки. –