我正在使用某些对象的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。
这样组织代码有意义吗(我发现这种方法几乎没有支持,但在使用Realm时,MVC最佳实践方面通常也很少(
如果这确实有意义,我如何解决从错误的线程访问Realm的问题,同时仍然直接在对象类中执行
realm.write
?
提前感谢!:(Simon
- 这样组织代码毫无意义。您将只能从创建的同一线程进行写入
- 要修改来自不同线程的对象,例如可以使用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...])
干净多了。
如果您想保证在事务中写入对象,就会出现另一个问题——要么全部成功,要么全部失败。你当前的对象无法做到这一点。
最后一个问题是,您通常需要实例化一个对象并向其添加一些数据,在写入领域之前填充对象。对于问题中的代码,您将在填充数据后立即编写它。您必须将相同的代码添加到每个属性中。