我可以直接在Object数据模型中进行realm.writes吗



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

为了清理/重构我的代码(从视图和控制器中获取realm.write(,我尝试将它们直接放在持久化对象类中。

基本逻辑是这样的:

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.write。无论如何,这就是主意。

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

"从错误线程访问的领域";

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

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

  1. 这样组织代码有意义吗(我发现这种方法几乎没有支持,但在使用Realm时,MVC最佳实践方面通常也很少(

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

提前感谢!:(Simon

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

你不会想这么做的。

当您想向realm写入时,没有理由不使用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个对象,一旦设置了数据属性,就会立即写入它们——如果在写入之前,你想在内存中设置三个var并heep,该怎么办?例如,您的用户正在您的应用程序中创建项目列表-如果用户决定不这样做并点击"取消",则您必须再次点击数据库才能删除对象。

考虑一个您想"同时"写入10个对象的情况?

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

干净多了。

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

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

最新更新