【发布时间】:2021-06-05 07:47:04
【问题描述】:
我的项目包含一系列膳食计划。现在,用户可以star MealPlan,这将更新 MealPlan 文档中的 isStarred Bool 值。但是,这只会更新每个用户当前访问的数据库。
我如何对其进行编码,以便用户拥有自己的一套已加星标膳食计划?
我目前正在使用 Firebase 身份验证和 Firestore。这是我的 MealPlan 结构:
struct MealPlan {
var docID:String?
var title:String?
var recipeSource:String?
var estimatedTime:String?
var coverImageView:String?
var equipment:[String]?
var instructions:[String]?
var isStarred:Bool?
}
我的用户结构:
struct User {
var userId:String?
var firstName:String?
var lastName:String?
var email:String?
}
我的数据模型:
class MealPlanModel {
var delegate:MealPlanProtocol?
var listener:ListenerRegistration?
func getMealPlans(_ starredOnly:Bool = false) {
// Detach any listener
listener?.remove()
// Get a reference to the database
let db = Firestore.firestore()
var query:Query = db.collection("mealPlans")
// If filtering for starred Meal Plans, update the query
if starredOnly {
query = query.whereField("isStarred", isEqualTo: true)
}
self.listener = query.addSnapshotListener({ (snapshot, error) in
// Check for errors
if error == nil && snapshot != nil {
var mealPlans = [MealPlan]()
// Parse documents into mealPlans
for doc in snapshot!.documents {
let m = MealPlan(
docID: doc["docID"] as? String,
title: doc["title"] as! String,
recipeSource: doc["recipeSource"] as? String,
estimatedTime: doc["estimatedTime"] as? String,
coverImageView: doc["coverImageView"] as? String,
ingredientsProduce: doc["ingredientsProduce"] as? [String],
ingredientsProtein: doc["ingredientsProtein"] as? [String],
ingredientsSpices: doc["ingredientsSpices"] as? [String],
ingredientsOther: doc["ingredientsOther"] as? [String],
equipment: doc["equipment"] as? [String], instructions: doc["instructions"] as? [String],
isStarred: doc["isStarred"] as? Bool)
mealPlans.append(m)
}
// Call the delegate and pass back the notes in the main thread
DispatchQueue.main.async {
self.delegate?.mealPlansRetrieved(mealPlans: mealPlans)
}
}
})
}
func updateStarredStatus(_ docId:String, _ isStarred:Bool) {
let db = Firestore.firestore()
db.collection("mealPlans").document(docId).updateData(["isStarred":isStarred])
}
}
以及在我的 View Controller 中主演的方法:
@IBAction func starButtonTapped(_ sender: Any) {
// Toggle the star filter status
isStarFiltered.toggle()
// Run the query
if isStarFiltered {
model.getMealPlans(true)
}
else {
model.getMealPlans()
}
// Update the starButton
setStarFilterButton()
}
是否需要将已加星标的 MealPlan 的 docID 复制到 Users 结构中的键中?然后在过滤星标 MealPlans 时显示那些 MealPlans?
非常感谢任何帮助/指导!
【问题讨论】:
标签: ios database firebase google-cloud-firestore user-controls