Принудительно перезагружать изображение при изменении URL-адреса SwiftUI

Новое (для swiftui), я хотел бы отобразить изображение (обновить представление), как только URL-адрес будет готов. Очевидно, State var недостаточно. Похоже, что .onReceive и издатель могут помочь, но я беспомощен. NB: я использую KingFisher, но, похоже, это тот же случай для любого загрузчика. Ситуация кажется особенной (URL-адрес не готов при создании представления), но это более общая тема: например, когда запросы синхронизируются и фото профиля необходимо обновить когда другой пользователь меняет его.

Изменить: после еще нескольких тестов кажется, что представление обновляется, если, например, мы используем dispachQueue, чтобы отложить на одну секунду, а затем пытаемся обновить. Он не обновляется при получении значения напрямую с помощью firebase onAppear

import SwiftUI
import Firebase
import Kingfisher


struct Test4: View {

    @State private var mProfilePhotoUrl: URL = URL(string:"0")!
 
 var body: some View {
    
 VStack(alignment: .center,spacing : 0){
           
           KFImage(mProfilePhotoUrl)
      
  }.onAppear(){
        setUpProfileElements()
       }
     
    }
    
    private func setUpProfileElements(){

    //    FirebaseRequest -> mProfilePhotoUrl = URL(string: User.profilePhoto)
     
    }
    
}

person it75    schedule 31.03.2021    source источник
comment
Похоже, что в этом случае ответственность за это должна ложиться на KingFisher - я удивлен, что он не справляется с этим сценарием. Как насчет добавления к нему .id(mProfilePhotoUrl), чтобы заставить его измениться при изменении URL-адреса?   -  person jnpdx    schedule 31.03.2021
comment
Это будет обновляться при использовании задержки, но не с запросом firebase, используемым при появлении. Использование Id для принудительного обновления сделало трюк. Другие могут поддержать это дело. Спасибо !   -  person it75    schedule 31.03.2021


Ответы (1)


Это ответ jnpdx! Я не знаю причины, если бы он был слишком близок к отображению, но просмотр не обновлялся с помощью запроса firebase onAppear, использование идентификатора предсказывало обновление.

struct Test4: View {

    @State private var mProfilePhotoUrl: URL = URL(string:"0")!
    *@State private var ID = 0*

 var body: some View {
    
 VStack(alignment: .center,spacing : 0){
           
           KFImage(mProfilePhotoUrl)*.id(ID)*
      
  }.onAppear(){
        setUpProfileElements()
       }
     
    }
    
    private func setUpProfileElements(){

    //    FirebaseRequest -> mProfilePhotoUrl = URL(string: User.profilePhoto)
     //                    *-> self.ID += 1*
    }
    
}
person it75    schedule 31.03.2021
comment
Вы можете отметить свой ответ как принятый - person jnpdx; 31.03.2021
comment
пройдет 2 дня, прежде чем я смогу отметить свой ответ как принятый, но я сделаю это, спасибо - person it75; 31.03.2021
comment
Использование .id () помогло мне, но тогда я не могу использовать .resizable(). - person erickva; 03.07.2021
comment
Ypu означает, что если вы используете .frame (w: p1, h: p2), изображение не изменится при обновлении значений? - person it75; 03.07.2021