我可以直接在对象数据模型中创建 realm.writes 吗?

Can I make realm.writes directly in the Object data model?

我正在使用某些对象的领域数据持久性编写一个应用程序。

为了清理 up/remodel 我的代码(从视图和控制器中获取 realm.writes),我试图将它们直接放在持久对象 class 中。

逻辑基本上是这样的:

class PersistedObject: Object {
   public var data: String {
      get { _saved_data }
      set {
         do { try realm?.write { _saved_data = newValue }
         } catch { print(error) }
      }
   }

   @objc dynamic private var _saved_data = "hello there"
}

这样,我就可以从视图控制器访问和重写领域对象属性,而无需直接在其中使用 realm.writes。无论如何,就是这个想法。

这有时有效。其他时候,应用程序会因错误而崩溃...

"Realm accessed from incorrect thread"

...这就是我目前正在努力解决的问题。

这是我的第一个 iOS 应用程序,也是我第一次使用 Realm。

  1. 像这样组织代码是否有意义(我发现这种方法的支持很少,但通常也很少,就工作时的 MVC 最佳实践而言与境界)

  2. 如果确实有意义,我如何解决从错误线程访问 Realm 的问题,同时仍然直接在对象 class 中执行 realm.writes?

提前致谢! :) 西蒙

  1. 这样组织代码是没有意义的。您将只能从创建它的同一个线程写入
  2. 要修改来自不同线程的对象,您可以使用 ThreadSafeReference 例如

你不会想要那样做的。

没有理由不 realm.write 每当您想写入领域时 - 这就是它的用途。此模式有效:

// Use them like regular Swift objects
let myDog = Dog()
myDog.name = "Rex"
myDog.age = 1

// Get the default Realm
let realm = try! Realm()

// Persist your data easily
try! realm.write {
    realm.add(myDog)
}

显然上面的代码应该有更好的错误捕获。

另一个缺点是,如果您想写入 10 个对象,它们会在设置数据 属性 后立即写入 - 如果您想要设置三个变量并在写入之前堆在内存中怎么办?例如您的用户正在您的应用程序中创建项目列表 - 如果用户决定不这样做并点击取消,您将不得不再次点击数据库以删除对象。

考虑一个你想写 10 个对象的情况'at the same time'?

realm.add([obj0, obj1, obj2...])

干净多了。

如果您想保证对象在事务中写入,则会出现另一个问题——要么全部成功,要么全部失败。您当前的对象无法做到这一点。

最后一个问题是,您通常希望实例化一个对象并向其添加一些数据,在写入领域之前填充该对象。使用问题中的代码,您将在填充数据后立即编写它。您必须将相同的代码添加到每个 属性.