【发布时间】:2020-08-24 15:37:33
【问题描述】:
我按照在线教程进行操作,似乎有一些工作正常,但是我正在尝试根据有效的订单自动更新我的视图,但前提是我关闭并重新打开应用程序。
Observer.swift
class postsobserver: ObservableObject {
@Published var posts = [datatype1]()
init() {
let settings = FirestoreSettings()
settings.isPersistenceEnabled = true
let db = Firestore.firestore()
db.settings = settings
db.collection("posts").order(by: "likes", descending: true).addSnapshotListener { snap, err in
if err != nil {
print((err?.localizedDescription)!)
return
}
for i in snap!.documentChanges {
if i.type == .added {
let id = i.document.documentID
let name = i.document.get("name") as! String
let image = i.document.get("image") as! String
let likes = i.document.get("likes") as! String
self.posts.append(datatype1(id: id, name: name, image: image, likes: likes))
}
if i.type == .removed {
let id = i.document.documentID
for j in 0 ..< self.posts.count {
if self.posts[j].id == id {
self.posts.remove(at: j)
return
}
}
}
if i.type == .modified {
let id = i.document.documentID
let likes = i.document.get("likes") as! String
for j in 0 ..< self.posts.count {
if self.posts[j].id == id {
self.posts[j].likes = likes
return
}
}
}
}
}
}
}
Home.swift
@ObservedObject var postsobserved = postsobserver()
let columns = [
GridItem(.adaptive(minimum: 100)),
]
var body: some View {
ScrollView(.vertical, showsIndicators: false) {
VStack {
if postsobserved.posts.isEmpty {
Text("no new posts").fontWeight(.heavy)
} else {
LazyVGrid(columns: columns, spacing: 20) {
ForEach(postsobserved.posts) { i in
postCard(user: i.name, image: i.image, id: i.id, likes: i.likes)
}
}
}
}
}
}
postCard.swift
import SwiftUI
import SDWebImageSwiftUI
import Firebase
import FirebaseFirestore
struct postCard: View {
var user = ""
var image = ""
var id = ""
var likes = ""
var body: some View {
VStack(alignment: .leading) {
HStack {
Text(user)
Spacer()
}
AnimatedImage(url: URL(string: image))
.resizable()
.aspectRatio(contentMode: .fit)
.frame(height: 100)
HStack {
Button(action: {
let db = Firestore.firestore()
let like = Int.init(self.likes)!
db.collection("posts").document(self.id).updateData(["likes": "\(like + 1)"]) { err in
if err != nil {
print(err)
return
}
print("updated...")
}
}) {
Image(systemName: "arrow.up.square")
.frame(width: 26, height: 26)
}
Button(action: {
let db = Firestore.firestore()
let like = Int.init(self.likes)!
db.collection("posts").document(self.id).updateData(["likes": "\(like - 1)"]) { err in
if err != nil {
print(err)
return
}
print("updated...")
}
}) {
Image(systemName: "arrow.down.square")
.frame(width: 26, height: 26)
}
Spacer()
}.padding(.top, 8)
Text("\(likes) Likes")
}.padding(8)
}
}
我很确定我在某处犯了错误,但在过去 4 小时内尝试了一些事情,我认为是时候寻求帮助了
编辑:
当我单击箭头时,它们似乎可以正确更新而无需重新加载应用程序,但 .order(by: "likes", descending: true) 似乎不会改变顺序,除非我重新加载应用程序。
【问题讨论】:
标签: swift google-cloud-firestore swiftui