合并SwiftUI远程获取数据-ObjectBinding不会更新视图

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了合并SwiftUI远程获取数据-ObjectBinding不会更新视图相关的知识,希望对你有一定的参考价值。

我正在尝试学习Combine,这对我来说是PITA。我没学过RX Swift,所以这是全新的。我敢肯定,我缺少这种简单的东西,但希望能有所帮助。

我正在尝试从API提取一些JSON并加载到列表视图中。我有一个符合ObservableObject的视图模型,并更新了一个@Published属性,该属性是一个数组。我使用该VM来加载列表,但是看起来该API返回之前,视图的加载方式(列表显示为空白)。我希望这些属性包装器能够执行我认为应该做的事情,并在对象更改时重新渲染视图。

就像我说的那样,我确定我缺少简单的东西。如果您能找到它,我将很乐意为您提供帮助。谢谢

class PhotosViewModel: ObservableObject {

    var cancellable: AnyCancellable?

    @Published var photos = Photos()

    func load(user collection: String) {
        guard let url = URL(string: "https://api.unsplash.com/users/(collection)/collections?client_id=(Keys.unsplashAPIKey)") else {
            return
        }
        cancellable = URLSession.shared.dataTaskPublisher(for: url)
            .map { $0.data }
            .decode(type: Photos.self, decoder: JSONDecoder())
            .replaceError(with: defaultPhotosObject)
            .receive(on: RunLoop.main)
            .assign(to: .photos, on: self)
    }

}
struct PhotoListView: View {
    @EnvironmentObject var photosViewModel: PhotosViewModel
    var body: some View {
        NavigationView {
            List(photosViewModel.photos) { photo in
                NavigationLink(destination: PhotoDetailView(photo)) {
                    PhotoRow(photo)
                }
            }.navigationBarTitle("Photos")
        }
    }
}
struct PhotoRow: View {
    var photo: Photo
    init(_ photo: Photo) {
        self.photo = photo
    }
    var body: some View {
        HStack {
            ThumbnailImageLoadingView(photo.coverPhoto.urls.thumb)
            VStack(alignment: .leading) {
                Text(photo.title)
                    .font(.headline)
                Text(photo.user.firstName)
                    .font(.body)
            }
            .padding(.leading, 5)
        }
        .padding(5)
    }
}
答案

这最终导致我的Codable结构设置不正确。一旦在。replaceError方法中添加了默认对象而不是空白数组(感谢@Asperi),便能够看到解码错误并进行修复。现在就像魅力一样!

原件:

    func load(user collection: String) {
        guard let url = URL(string: "https://api.unsplash.com/users/(collection)/collections?client_id=(Keys.unsplashAPIKey)") else {
            return
        }
        cancellable = URLSession.shared.dataTaskPublisher(for: url)
            .map { $0.data }
            .decode(type: Photos.self, decoder: JSONDecoder())
            .replaceError(with: [])
            .receive(on: RunLoop.main)
            .assign(to: .photos, on: self)
    }

更新:

    func load(user collection: String) {
        guard let url = URL(string: "https://api.unsplash.com/users/(collection)/collections?client_id=(Keys.unsplashAPIKey)") else {
            return
        }
        cancellable = URLSession.shared.dataTaskPublisher(for: url)
            .map { $0.data }
            .decode(type: Photos.self, decoder: JSONDecoder())
            .replaceError(with: defaultPhotosObject)
            .receive(on: RunLoop.main)
            .assign(to: .photos, on: self)
    }

以上是关于合并SwiftUI远程获取数据-ObjectBinding不会更新视图的主要内容,如果未能解决你的问题,请参考以下文章

远程仓库获取最新代码合并到本地分支

git:如何从远程分支获取并合并到本地分支?

远程图像使用 List 正确加载,但在使用带有嵌入式 VStack 的 ScrollView 和 SwiftUI 时不加载

SwiftUI 列表 - 远程图像加载 = 图像闪烁(重新加载)

只获取已经合并为master / develop的远程分支

您的配置指定与远程的 <branch name> 合并,但没有获取这样的 ref。?