Swift iOS - добавьте данные как пользовательскую модель, содержащую пользовательскую модель, в Firestore - PullRequest
1 голос
/ 01 апреля 2019

Итак, у меня есть два пользовательских класса моделей. Один - 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, я в основном хочу, чтобы объект страниц был вложенной коллекцией в объекте Story. Но я не совсем понимаю, как правильно поступить так, чтобы модели могли правильно отображать и декодировать из ответа Firebase.

Единственный способ, которым я могу думать об этом, - это создать историю в базе данных, получить обратный вызов с идентификатором, а затем создать страницу в ней. Проблема в том, что моя модель Story не будет включать пользовательскую модель Page

1 Ответ

1 голос
/ 01 апреля 2019

Во-первых, вам не нужно писать в 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("?")
    }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...