我正在制作一个应用程序,用于在 Feedview 中显示帖子。 FeedView 有一个名为 FeedCellView 的 childView。我将每个帖子发送到相应的 FeedCellView。在 FeedCellView 中,它有 init()
函数,我正在其中初始化 ViewModel。
问题出在 SwiftUI 中,视图的 init()
调用从 1 到无穷大。因此,不确定是否会调用我的视图的 init()
。至于这个,当我从不同的视图返回我的 FeedView 时,我的帖子没有更新,因为 init()
只为我调用一次。
所以我不应该将数据从视图的初始化传递到视图模型,因为它是不确定的。将数据从父视图传递到子视图模型的最佳做法是什么?
供稿视图:
struct FeedView: View {
@ObservedObject private var feedViewModel = FeedViewModel()
var body: some View {
ScrollView(){
LazyVStack(spacing:32){
ForEach(feedViewModel.posts){post in
FeedCellView(viewModel: FeedCellViewModel(post: post))
}
}
}
}
}
FeedCellView:
struct FeedCellView: View {
@ObservedObject var feedCellViewModel:FeedCellViewModel
init(viewModel:FeedCellViewModel){ //This is not being called more than once.
self.feedCellViewModel = viewModel
print("feed Cell View Init")
}
var body: some View {
VStack(alignment:.leading){
if let user = feedCellViewModel.post.user{
NavigationLink(
destination: ProfileView(user: user),
label: {
HStack{
if let imageUrl = feedCellViewModel.post.ownerImageUrl{
KFImage(URL(string: imageUrl))
.resizable()
.scaledToFill()
.............................
.............................
FeedCellViewModel:
class FeedCellViewModel:ObservableObject{
@Published var post:PostModel
init(post:PostModel){
self.post = post
fetchUser()
checkLike()
}
func fetchUser(){
print("Feed cell ViewModel fetchUser called")
Firestore.firestore().collection("users").document(post.ownerId).getDocument { (snap, error) in
if let error = error{
print(error.localizedDescription)
return
}
DispatchQueue.main.async {
self.post.user = try? snap?.data(as: UserModel.self)
guard let userImageUrl = self.post.user?.profileImageUrl else{return}
self.post.ownerImageUrl = userImageUrl
print("OwnerImageUrl \(self.post.ownerUsername): \(self.post.ownerImageUrl ?? "No Image Url")")
}
}
}
.....................
.....................
将数据从父视图传递到子视图的 viewModel 的最佳做法是什么?