簡體   English   中英

我應該使用存儲庫for Realm(ios)

[英]Should I use repository for Realm(ios)

首先,我在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)
    }
}

在數據庫API頂部添加抽象層非常常見。 許多其他開發人員已經將Realm包裝在他們自己的類中,以便將API隱藏在他們的業務邏輯代碼中。

需要注意幾個方面的考慮因素:

  1. 你需要保持小心,不要意外地傷害這種表現。 一些用戶甚至將數據從Realm對象復制到他們自己的對象中。 這違背了Realm的“零拷貝”機制的目的,所以應用程序現在本身比本機使用Realm更糟糕。
  2. 這是“先發制人的工作”。 你事先做了很多工作, 以防萬一你可能會改變主意。 我剛剛在一個相當大的應用程序中將Core Data轉換為Realm,它只花了幾個小時。 試圖構建一個“通用”數據庫解決方案,您可能永遠不會最終使用它可能無法獲得回報的聲音。
  3. 您正在增加應用復雜性。 這意味着更多的漏洞可能需要更嚴格的測試,以確保您的API和數據庫API保持同步。

只要您要移動的新數據庫也包含管理對象(即核心數據),從一個數據庫轉換到另一個數據庫通常不是很多工作。 因此,我建議在必要時避免不必要的工作。

免責聲明:我為Realm工作,但這是我的觀點,因為過去曾使用Core Data,原始SQLite和Realm發布個人應用程序。

您可以使用擴展來添加提取方法。 您可以為數據庫中的每個實體添加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
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM