【发布时间】:2020-09-22 11:22:42
【问题描述】:
我正在使用 SwiftUI 学习 MVVM,但我遇到了取消初始化 ViewModel 的问题。 View 使用 ListView 显示来自 ViewModel 的数据。如果我转到 ListView 行的详细信息类,然后返回 ListView,则应用程序会创建数据副本。 例如:如果一个列表有 100 个项目,我去列表行的 DetailView 然后返回,现在是 200 个项目,依此类推。如何阻止它?
列表视图:
import SwiftUI
import KingfisherSwiftUI
struct ListView: View {
@ObservedObject var viewModel = ListViewModel()
@State private var searchText = ""
var body: some View {
NavigationView {
VStack {
SearchBar(text: $searchText)
.padding(.top, -30)
List(viewModel.itemsList) { item in
NavigationLink(destination: ListDetail()) {
HStack {
KFImage(URL(string: String(item.thumbnailUrl)))
.resizable()
.frame(width: 80, height: 80)
.padding(EdgeInsets(top: 10, leading: 0, bottom: 10, trailing: 0 ))
}
VStack(alignment: .leading) {
Text(item.title)
.padding(.top, -10)
.padding(.bottom, 10)
Text(item.albumTitle)
.font(.system(size: 12))
.padding(.bottom, 0)
}
.padding(.leading, 10)
.padding(.trailing, 20)
}
}
}
.onAppear {
self.viewModel.fetchPhotos()
}
}
}
}
列表视图模型:
import SwiftUI
import Combine
class ListViewModel: ObservableObject {
private let persistenceService = PersistenceService()
@Published var albumsList = [Album]()
@Published var photosList = [Photo]()
@Published var usersList = [User]()
@Published var itemsList = [ListItem]()
func fetchAlbums() {
albumsList += persistenceService.fetchAlbums()
}
func fetchPhotos() {
photosList += persistenceService.fetchPhotos()
fetchAlbums()
if albumsList.count > 0 && photosList.count > 0 {
setItemList()
}
}
func setItemList() {
if albumsList.count > 0 && photosList.count > 0 {
let photo: Photo
let album: Album
itemsList = photosList.compactMap { photo in
guard let album = albumsList.first(where: { $0.id == photo.id}) else {
return nil
}
return ListItem(id: album.id, title: photo.title, albumTitle: album.title, thumbnailUrl: photo.thumbnailUrl)
}
print("Items \(itemsList.count)")
}
}
}
【问题讨论】: