与关系(iOS)处理壁炉模型的模式



我正在寻找现有iOS应用中的模式示例(Swift首选,但我想没关系(,以获取有关如何处理Firebase时如何处理模型的一些想法(或任何NOSQL DB(。并发症是由于1(Firebase听取数据更改的方式,以及2(将DB请求逻辑从模型中删除。

所以说我有这样的东西:

struct User {
    let name: String
    let checkin: Checkin
}
struct Checkin {
    let name: String
    let coordinates: Double
}

现在,当我决定要在视图控制器中进行数据时,我将执行类似Database.database()..reference()...的操作,并在模型解析JSON上使用一种方法并将其插入模型。现在,当它到达关系属性时会发生什么(在这种情况下,创建User实例时的checkin(?如果我想要具有所有儿童关系的完整用户模型,我只会从Firebase中恢复类似{ checkin: someRandomCheckinId }的内容。我可以再打电话以按ID进行检查,但是当从Firebase中解析数据时,我必须在模型中执行该逻辑,这似乎并不理想 - 看来逻辑最佳属于VC(或VC称为单独的数据管理器类(。有更好的方法吗?

此外,考虑到它是Firebase的主要功能,我希望能够听取更改。我无法想象用一群听众污染我的模型是一件好事。🤔

任何具有良好模式的存储库的例子都将很棒,可以帮助我围绕适当的解决方案。预先感谢!

这个问题有两个部分。首先是如何在NOSQL文档存储中构造数据。第二个是如何以现代OO语言构造应用程序。两者都远远超过了火箱和迅捷的范围。

在第一部分中,我会给您的建议是,您应该将相关数据放在一起以便快速访问。随着数据的重复,使用这些类型的数据库时,通常会有空间惩罚。这是可以的,因为与时间相比,空间相对便宜。在您的示例中,如果您经常想在获得"用户"时获得所有" checkins",则在该用户中为用户存储" checkins"。如果您习惯于使用RDB,则需要记住,使用此类型的存储,您可以存储数据层,并且属性可以具有多个值。确保您阅读有关数据的访问文档,因为它们对如何存储数据有一些建议,以避免浪费时间和空间。主要的想法是保持数据扁平而不是深层,并记住,要让父母也得到所有孩子。这通常涉及一些数据重复。

在问题的第二部分中,您将不得不更深入地挖掘。首先阅读软件工程原理。坚实的原则是最重要的,但是您应该遵守许多其他原则。一项原则指出,您应该将相关的数据和行为保持在一起。另一个指出,每个模块(类(应具有一项责任(更改的原因(。大多数iOS开发人员都遵循非常糟糕的开发实践,即使用违反许多原则的所有应用程序逻辑加载视图控制器。模型类不仅用于存储状态,还应包含与该状态相关的行为。ViewController不应访问数据库,并且对数据库一无所知。这应该发生在您的应用程序模型中。如果以每种类型的特定方式访问数据,则将该逻辑存储在类型上。如果所有类型的大部分都是相同的,则将该部分抽象出来。

最新更新