首页 > 解决方案 > Instagram 教程 SwiftUI Firebase 未加载时间轴

问题描述

我是编码新手,一直在尝试通过 instagram 教程来理解一些概念。自从更新到 Xcode 12 后,我的 Firebase 似乎不再工作,并且没有显示在主页上。我在其中放置了一个矩形,看看它是否是 if !homeViewModel.isLoading 是它看起来如此的原因。

在此处输入图像描述

这是我当前的代码:

import SwiftUI
import URLImage
import Firebase

struct HomeView: View {
    
    @ObservedObject var homeViewModel = HomeViewModel()
    
    var body: some View {
        NavigationView {
            
            ScrollView(.vertical, showsIndicators: false) {
                
                Story()
                Rectangle().frame(width: 200, height: 200).foregroundColor(.red)
                if !homeViewModel.isLoading {
                    ForEach(self.homeViewModel.posts, id: \.postId) { post in
                        VStack(alignment: .center) {
                            
                            HeaderCell(post: post)
                            FooterCell(post: post)
                            
                            }.background(Color.white).cornerRadius(10)
                            .padding(.leading, 10).padding(.trailing, 10)
                    }
                    
                }
                }.background(Color.gray)

主视图模型:

import Foundation
import SwiftUI
import Firebase

class HomeViewModel: ObservableObject {
    @Published var posts: [Post] = []
    @Published var isLoading = false
    
    var listener: ListenerRegistration!
    
//    init() {
//        loadTimeline()
//    }
    
    func loadTimeline() {
        self.posts = []
        isLoading = true
        
        Api.Post.loadTimeline(onSuccess: { (posts) in
            self.isLoading = false

            if self.posts.isEmpty {
                self.posts = posts
            }
        }, newPost: { (post) in
            if !self.posts.isEmpty {
                self.posts.insert(post, at: 0)
            }
        }) { (listener) in
            self.listener = listener
        }

    }
}

加载时间线函数:

func loadTimeline(onSuccess: @escaping(_ posts: [Post]) -> Void, newPost: @escaping(Post) -> Void, listener: @escaping(_ listenerHandle: ListenerRegistration) -> Void) {
        guard let userId = Auth.auth().currentUser?.uid else {
            return
        }
        let listenerFirestore = Ref.FIRESTORE_TIMELINE_DOCUMENT_USERID(userId: userId).collection("timelinePosts").order(by: "date", descending: true).addSnapshotListener({ (querySnapshot, error) in
            guard let snapshot = querySnapshot else {
                return
            }
            var posts = [Post]()
            snapshot.documentChanges.forEach { (documentChange) in
                switch documentChange.type {
                case .added:
                    print("type: added")
                    let dict = documentChange.document.data()
                    guard let decoderPost = try? Post.init(fromDictionary: dict) else {return}
                    newPost(decoderPost)
                    posts.append(decoderPost)
                case .modified:
                    print("type: modified")
                case .removed:
                    print("type: removed")
                }
            }
            onSuccess(posts)
        })
        
        listener(listenerFirestore)
        
    }

出于某种原因,似乎该功能没有被触发并且时间线没有加载。不确定为什么...在更新之前它工作正常?

任何帮助将非常感激!

标签: xcodefirebaseswiftuiinstagram

解决方案


推荐阅读