xcode - 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)
}
出于某种原因,似乎该功能没有被触发并且时间线没有加载。不确定为什么...在更新之前它工作正常?
任何帮助将非常感激!
解决方案
推荐阅读
- android-studio - 使用 3rd 方库将表情符号添加到我的 android 自定义键盘
- api - 新 API 版本的标准
- spring-boot - 执行服务时假装客户端异常中的多个@RequestBody
- angular - 如何在 ng2-date-picker 中打开图标单击角度?
- html - display:none 在移动设备上无法正常工作
- javascript - 函数 __doPostBack() 在 iOS、iPadOS 浏览器中不起作用
- php - php setcookie 在安卓手机上不起作用
- azure-functions - 使用 B2C 自定义策略调用 Azure Function 时如何发送电子邮件?
- jquery - jquery ajax post将空值传递给控制器
- c# - 子表属性未在 ef 核心继承中获取