合并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不会更新视图的主要内容,如果未能解决你的问题,请参考以下文章
远程图像使用 List 正确加载,但在使用带有嵌入式 VStack 的 ScrollView 和 SwiftUI 时不加载