Swift iOS - 将数据作为包含自定义模型的自定义模型添加到 Firestore
Swift iOS - Add data as custom model containing custom model to Firestore
所以我有两个自定义模型 类。一个是Story
,另一个是Page
。故事包含多个属性,包括 pages
.
数组
struct Story {
var name: String
var pages: [Page]
var tags: [String]
var likes: [String]
var isPrivate: Bool
var dictionary: [String: Any] {
return [
"name": name,
"pages": pages,
"tags": tags,
"likes": likes,
"isPrivate": isPrivate,
]
}
struct Page {
let thumbnail: String
let image: String?
let video: String?
var dictionary: [String: Any] {
return [
"thumbnail": thumbnail,
"image": image as Any,
"video": video as Any
]
}
当我上传到 Firebase 时,我基本上希望 pages 对象成为 Story 对象中的子集合。但是我对如何正确地做到这一点感到困惑,这样我就可以让模型从 Firebase 响应中正确映射和解码。
我能想到的唯一方法是在数据库中创建故事,获取带有 ID 的回调,然后在其中创建页面。问题是我的 Story
模型不会包含自定义 Page
模型
首先,您无需写入 Firestore 即可获取该文档的自动生成 ID。 Firestore 自动在客户端生成 ID(它是时间戳和随机的组合)。
其次,您可能需要考虑在 Story
中添加一个 属性 以包含字典格式的页面数组:
struct Page {
let thumbnail: String
let image: String?
let video: String?
var dictionary: [String: Any] {
return [
"thumbnail": thumbnail,
"image": image as Any,
"video": video as Any
]
}
}
struct Story {
var name: String
var pages: [Page]
var pagesData: [[String: Any]] // I added this for convenience
var tags: [String]
var likes: [String]
var isPrivate: Bool
var dictionary: [String: Any] {
return [
"name": name,
"pages": pages,
"tags": tags,
"likes": likes,
"isPrivate": isPrivate,
]
}
}
然后正常创建页面:
let page1 = Page(thumbnail: "abc", image: nil, video: nil)
let page2 = Page(thumbnail: "xyz", image: nil, video: nil)
创建故事并将页面注入其中,包括数据化版本:
let story = Story(name: "Story", pages: [page1, page2], pagesData: [page1.dictionary, page2.dictionary], tags: ["kiwi", "mango"], likes: ["x", "y"], isPrivate: false)
使用 Firestore 生成随机标识符:
let docRef = Firestore.firestore().collection("someCollection").document()
let docId = docRef.documentID
如果您需要共享此标识符,您现在可以在写入 Firestore 之前将此标识符注入每个对象。
创建将写入 Firestore 的数据对象:
let data: [String: Any] = [
"name": story.name,
"pages": story.pagesData
// etc
]
在后端,pages
字段将是一个地图数组。
然后将数据写入Firestore:
docRef.setData(data) { (error) in
if let error = error {
print(" \(error)")
} else {
print("")
}
}
对于它的价值,任何通过 Google 寻找自定义数据模型处理 + Swift + Firebase 的人都应该使用 Codable
协议检查 Firebase 的这个功能。
https://firebase.google.com/docs/firestore/manage-data/add-data#custom_objects
具体来说,这使您可以访问一个特殊的 setData
调用,看起来像 document("LA").setData(from: city)
.
在 Firebase v7.3+ 中您应该不再需要额外的导入,这太棒了!如果您仍在使用 v6 或更早版本,则需要它。
如果您无法在代码中访问此函数,那是因为您需要 import FirebaseFirestoreSwift
,它是 v7.0 之前 Swift 的特殊扩展。
所以我有两个自定义模型 类。一个是Story
,另一个是Page
。故事包含多个属性,包括 pages
.
struct Story {
var name: String
var pages: [Page]
var tags: [String]
var likes: [String]
var isPrivate: Bool
var dictionary: [String: Any] {
return [
"name": name,
"pages": pages,
"tags": tags,
"likes": likes,
"isPrivate": isPrivate,
]
}
struct Page {
let thumbnail: String
let image: String?
let video: String?
var dictionary: [String: Any] {
return [
"thumbnail": thumbnail,
"image": image as Any,
"video": video as Any
]
}
当我上传到 Firebase 时,我基本上希望 pages 对象成为 Story 对象中的子集合。但是我对如何正确地做到这一点感到困惑,这样我就可以让模型从 Firebase 响应中正确映射和解码。
我能想到的唯一方法是在数据库中创建故事,获取带有 ID 的回调,然后在其中创建页面。问题是我的 Story
模型不会包含自定义 Page
模型
首先,您无需写入 Firestore 即可获取该文档的自动生成 ID。 Firestore 自动在客户端生成 ID(它是时间戳和随机的组合)。
其次,您可能需要考虑在 Story
中添加一个 属性 以包含字典格式的页面数组:
struct Page {
let thumbnail: String
let image: String?
let video: String?
var dictionary: [String: Any] {
return [
"thumbnail": thumbnail,
"image": image as Any,
"video": video as Any
]
}
}
struct Story {
var name: String
var pages: [Page]
var pagesData: [[String: Any]] // I added this for convenience
var tags: [String]
var likes: [String]
var isPrivate: Bool
var dictionary: [String: Any] {
return [
"name": name,
"pages": pages,
"tags": tags,
"likes": likes,
"isPrivate": isPrivate,
]
}
}
然后正常创建页面:
let page1 = Page(thumbnail: "abc", image: nil, video: nil)
let page2 = Page(thumbnail: "xyz", image: nil, video: nil)
创建故事并将页面注入其中,包括数据化版本:
let story = Story(name: "Story", pages: [page1, page2], pagesData: [page1.dictionary, page2.dictionary], tags: ["kiwi", "mango"], likes: ["x", "y"], isPrivate: false)
使用 Firestore 生成随机标识符:
let docRef = Firestore.firestore().collection("someCollection").document()
let docId = docRef.documentID
如果您需要共享此标识符,您现在可以在写入 Firestore 之前将此标识符注入每个对象。
创建将写入 Firestore 的数据对象:
let data: [String: Any] = [
"name": story.name,
"pages": story.pagesData
// etc
]
在后端,pages
字段将是一个地图数组。
然后将数据写入Firestore:
docRef.setData(data) { (error) in
if let error = error {
print(" \(error)")
} else {
print("")
}
}
对于它的价值,任何通过 Google 寻找自定义数据模型处理 + Swift + Firebase 的人都应该使用 Codable
协议检查 Firebase 的这个功能。
https://firebase.google.com/docs/firestore/manage-data/add-data#custom_objects
具体来说,这使您可以访问一个特殊的 setData
调用,看起来像 document("LA").setData(from: city)
.
在 Firebase v7.3+ 中您应该不再需要额外的导入,这太棒了!如果您仍在使用 v6 或更早版本,则需要它。
如果您无法在代码中访问此函数,那是因为您需要 import FirebaseFirestoreSwift
,它是 v7.0 之前 Swift 的特殊扩展。