数组更改时SwiftUI列表未更新

问题描述

VStack(spacing: 0){
    List{
        ForEach(postsData.fetchedPosts,id: \.postID) { post in
            SocialPostView(post: post,showAccount: self.$showAccount,fetchedUser: self.$fetchedUser)
                .padding(.vertical)
                .listRowInsets(EdgeInsets())
                .onAppear {
                    self.elementOnAppear(post)
            }
        }
    }
    .pullToRefresh(isShowing: $isShowing) {
        DispatchQueue.main.asyncAfter(deadline: .now() + 1) {
            self.isShowing = false
            self.postsData.newFetch = true
            self.postsData.fetchPosts(userInfo: self.userInfo)
        }
    }
}
private func elementOnAppear(_ post: Post) {
    /* onAppear on the view is called when a view appears on screen.
     elementOnAppear asks the view model if the element is the last one.
     If so,we ask the view model to fetch new data. */
    
    if self.postsData.isLastPostInList(post: post) {
        self.postsData.fetchPosts(userInfo: self.userInfo)
    }
}

当每个列表元素出现时,它会检查它是否是数组中的最后一个元素。如果是这样,它将从Firestore获取更多信息并更新fetchedPosts。但是,当数组更新时,列表不会更新,因此不会显示新元素。

这是ObservableObject,它发布数组。

class SocialObservable: ObservableObject{
    let db = Firestore.firestore()
    
    let objectWillChange = ObservableObjectPublisher()
    
    @Published var fetchedPosts = [Post]()
    
    @Published var lastSnap : DocumentSnapshot?
    @Published var reachedEnd = false
    
    var currentListener: ListenerRegistration?
    
    var newFetch = false {
        willSet{
            objectWillChange.send()
        }
    }
    
    init(userInfo: UserData){
        print(userInfo.uid)
        fetchPosts(userInfo: userInfo)
    }
    
    func fetchPosts(userInfo: UserData){
        var first: Query?
        
        if lastSnap == nil || newFetch {
            //not last snapshot,or just updated feed
            
            if newFetch{
                newFetch.toggle()
                fetchedPosts = [] // clean up if new fetch
            }
            
            first = db.collection("posts")
                .whereField("availability",arrayContains: userInfo.uid)
                .order(by: "date",descending: true)
                .limit(to: 1)
        }
        else {
            first = db.collection("posts")
                .whereField("availability",descending: true)
                .start(afterDocument: lastSnap!)
                .limit(to: 1)
        }

        first?.getDocuments(completion: { (snapshot,error) in
            guard let snapshot = snapshot else {
                print("Error: \(error.debugDescription)")
                return
            }
            let doc = snapshot.documents.map({postFromDB(obj: $0.data(),id: $0.documentID)})
            
            doc.map({print($0.postID)})
            // append to fetched posts
            self.fetchedPosts = self.fetchedPosts + doc
            print(self.fetchedPosts.count)
            
            //prepare for the next fetch
            guard let lastSnapshot = snapshot.documents.last else {
                // the collection is empty. no data fetched
                self.reachedEnd = true
                return
            }
            // save last snapshot
            self.lastSnap = lastSnapshot
        })
        
        
    }
    
    
    
    func isLastPostInList(post: Post) -> Bool {
        return post.postID == fetchedPosts.last?.postID
    }
    
    
}

有什么解决方法吗?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)