gpt4 book ai didi

ios - Realm 持久化的设计模式

转载 作者:可可西里 更新时间:2023-11-01 03:55:42 25 4
gpt4 key购买 nike

我在应用程序中使用 Realm,我尝试尽可能多地进行抽象,以便将来我可以在不做太多更改的情况下更换数据库提供程序。

尽管我担心以下问题,但此模式运行良好。

  • 是否每次都创建一个新的 Realm 对象(我目前的理解是 Realm 对象在内部缓存)?
  • 我使用 Realm 的方式有什么问题吗?
  • 是否有更好的设计模式适合我的目的?

    public struct BookDataLayer: BookDataLayerProvider {

    func isBookAvailable(bookIdentifier: String) throws -> Bool {
    let database = try getDatabase()
    return !database.objects(Book).filter("identifier = %@", bookIdentifier).isEmpty
    }

    func createOrUpdateBook(bookIdentifier: String, sortIndex: Int) throws {
    let book = Book()
    Book.bookIdentifier = bookIdentifier
    Book.sortIndex = sortIndex
    try create(book, update: true)
    }}

    protocol BookDataLayerProvider : DataAccessLayer {
    func isBookAvailable(bookIdentifier: String) throws -> Bool
    func createOrUpdateBook(bookIdentifier: String, sortIndex: Int) throws n}

    extension DataAccessLayer {

    func getDatabase() throws -> Realm {
    do {
    let realm = try Realm()
    // Advance the transaction to the most recent state
    realm.refresh()
    return realm
    } catch {
    throw DataAccessError.DatastoreConnectionError
    }
    }

    func create(object: Object, update: Bool = false) throws {
    let database = try self.getDatabase()

    do {
    database.beginWrite()
    database.add(object, update: update)
    // Commit the write transaction
    // to make this data available to other threads
    try database.commitWrite()
    } catch {
    throw DataAccessError.InsertError
    }
    }}

    // Usage
    let bookDataLayer = BookDataLayer()
    bookDataLayer.isBookAvailable("4557788")

    bookDataLayer.createOrUpdateBook("45578899", 10)

最佳答案

这是一个完全可靠的设计模式。开发人员从他们的代码中抽象出数据层 API 的方式是很常见的,以备不时之需。

回答您的问题:

  • 你是对的。 Realm 对象实例在内部缓存,因此您可以轻松调用 let realm = try! Realm() 多次,开销很小。
  • 除非您找到特定原因,否则可能没有必要在每次使用 Realm 实例时都调用 refresh()。主线程上的 Realm 实例会在运行循环的每次迭代中自动刷新,因此如果您希望在后台线程上发生更改,或者需要在之前访问更改,则只需调用 refresh()当前运行循环已经完成。
  • “更好”的设计模式可能是一个见仁见智的问题,但从我从其他代码库中看到的情况来看,你所拥有的已经很棒了! :)

关于ios - Realm 持久化的设计模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36396913/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com