首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Swift iOS -将数据添加为包含自定义模型的自定义模型

Swift iOS -将数据添加为包含自定义模型的自定义模型
EN

Stack Overflow用户
提问于 2019-04-01 16:26:29
回答 2查看 3.8K关注 0票数 7

所以我有两个定制的模型类。一个是Story,另一个是Page。这个故事包含多个属性,包括一个pages数组。

代码语言:javascript
复制
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的响应。

我能想到这样做的唯一方法是在数据库上创建一个Story,得到一个带有ID的回调,然后在其中创建页面。问题是我的Story模型不包括定制的Page模型

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-04-01 16:52:02

首先,您不需要写入Firestore就可以获得该文档的自动生成Id。Fi还原自动在客户机上生成Ids (它是时间戳和随机的组合)。

其次,您可能需要考虑向Story添加一个带有字典格式的页面数组的属性:

代码语言:javascript
复制
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,
        ]
    }

}

然后按照正常方式创建页面:

代码语言:javascript
复制
let page1 = Page(thumbnail: "abc", image: nil, video: nil)
let page2 = Page(thumbnail: "xyz", image: nil, video: nil)

创建一个故事并将页面插入其中,包括数据化版本:

代码语言:javascript
复制
let story = Story(name: "Story", pages: [page1, page2], pagesData: [page1.dictionary, page2.dictionary], tags: ["kiwi", "mango"], likes: ["x", "y"], isPrivate: false)

使用Firestore生成随机标识符:

代码语言:javascript
复制
let docRef = Firestore.firestore().collection("someCollection").document()
let docId = docRef.documentID

现在,如果需要每个对象共享该标识符,则可以在写入Firestore之前将该标识符注入每个对象。

创建将写入Firestore的数据对象:

代码语言:javascript
复制
let data: [String: Any] = [

    "name": story.name,
    "pages": story.pagesData
    // etc

]

在后端,pages字段将是一个映射数组。

然后,只需将数据写入Firestore:

代码语言:javascript
复制
docRef.setData(data) { (error) in

    if let error = error {
        print(" \(error)")
    } else {
        print("")
    }

}
票数 1
EN

Stack Overflow用户

发布于 2020-01-06 02:01:23

值得注意的是,任何通过谷歌在这里寻找自定义数据模型处理+ Swift + Firebase的用户都应该使用Codable协议查看Firebase的这一特性。

objects

具体来说,这使您可以访问一个类似于setData的特殊document("LA").setData(from: city)调用。

在Firebase v7.3+中,您应该不再需要额外的导入了,所以这太棒了!如果你还在v6或更高版本,你需要它。

如果您无法在代码中访问此函数,这是因为您需要import FirebaseFirestoreSwift,这是v7.0之前Swift的特殊扩展。

票数 11
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55459629

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档