我应该使用存储库for Realm(ios)

时间:2017-05-04 06:06:37

标签: ios swift service repository realm

首先,我在ios中相对较新,并且没有任何使用移动dbs的经验。

想要整合到我的应用程序Realm(swift)中,并想知道将服务层和存储库分开或者所有内容都包含在服务中是否有意义。

一些有良好观点的例子。

class UserService {

    var userRepository: UserRepository!

    func findById(userId: String) -> User? {
        return userRepository.findById(userId: userId)
    }
}

class UserRepository {

    private let realm = try! Realm()

    func findById(userId: String) -> User? {
        return realm.object(ofType: User.self, forPrimaryKey: userId)
    }
}

2 个答案:

答案 0 :(得分:6)

在数据库API的顶部添加抽象层非常常见。许多其他开发人员已经将Realm包装在他们自己的类中,以便将API隐藏在他们的业务逻辑代码中。

需要注意以下几点:

  1. 你需要保持小心,不要因此而意外伤害表现。一些用户甚至将数据从Realm对象复制到他们自己的对象中。这违背了Realm的零拷贝'机制,所以应用程序现在本身比本机使用Realm更糟糕。
  2. 这是先发制人的工作'。你事先做了很多工作,以防万一你可能会改变主意。我刚刚在一个相当大的应用程序中将Core Data转换为Realm,它只花了几个小时。试图建立一个通用的'数据库解决方案,你可能永远不会使用它可能无法获得回报的声音。
  3. 您正在增加应用复杂性。这意味着更多的漏洞可能需要更严格的测试,以确保您的API和数据库API保持同步。
  4. 只要您要移动的新数据库也包含管理对象(即核心数据),从一个数据库转换到另一个数据库通常不需要很多工作。因此,我建议在必要之前避免不必要的工作。

    免责声明:我为Realm工作,但这是我的观点,因为过去曾使用Core Data,原始SQLite和Realm发布个人应用程序。

答案 1 :(得分:1)

您可以使用扩展程序添加提取方法。 您可以为数据库中的每个实体添加Object子类,然后在需要时为这些方法添加扩展。 例如:

import RealmSwift

// Dog model
class Dog: Object {
    dynamic var name = ""
    dynamic var owner: Person? // Properties can be optional
}

您的提取方法:

extension Dog {
    class func fetch(with name: String) -> Dog? {
        return try! Realm().objects(Dog.self).filter("name == %@", name).first
    }
}