使用SwiftUI在MVVM中初始化ViewModel

时间:2020-09-22 11:22:42

标签: ios mvvm swiftui

我正在使用SwiftUI学习MVVM,并且在取消初始化ViewModel时遇到问题。视图使用ListView来显示ViewModel中的数据。如果我转到ListView行的Detail类,然后返回到ListView,则应用程序将创建数据重复项。 例如:如果一个列表包含100个项目,而我转到列表行的DetailView,然后返回,则现在是200个项目,依此类推。如何停止?

ListView:

var nbColumns =  Math.Ceiling( (double)nbItem / nbRow ) ; 

ListViewModel:

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()
        }
    }
    }
}

1 个答案:

答案 0 :(得分:1)

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

.onAppear {
    self.viewModel.fetchPhotos()
}

这样做

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