【问题标题】:Deinit ViewModel in the MVVM with SwiftUI使用 SwiftUI 在 MVVM 中 Deinit ViewModel
【发布时间】: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)")
    }
    
}
}

【问题讨论】:

    标签: ios mvvm swiftui


    【解决方案1】:

    避免数据重复的一种方法是将照片的获取从onAppear 方法转移到init。所以不是

    .onAppear {
        self.viewModel.fetchPhotos()
    }
    

    这样做

    init() {
        self.viewModel.fetchPhotos()
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-10-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-16
      • 1970-01-01
      • 1970-01-01
      • 2021-08-04
      相关资源
      最近更新 更多