Во-первых, вам не нужно писать в Firestore, чтобы получить автоматически сгенерированный Id этого документа. Firestore автоматически генерирует идентификаторы на клиенте (это комбинация метки времени и случайного числа).
Во-вторых, вы можете рассмотреть возможность добавления свойства к 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("?")
}
}