我可以直接在对象数据模型中创建 realm.writes 吗?
Can I make realm.writes directly in the Object data model?
我正在使用某些对象的领域数据持久性编写一个应用程序。
为了清理 up/remodel 我的代码(从视图和控制器中获取 realm.write
s),我试图将它们直接放在持久对象 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.write
s。无论如何,就是这个想法。
这有时有效。其他时候,应用程序会因错误而崩溃...
"Realm accessed from incorrect thread"
...这就是我目前正在努力解决的问题。
这是我的第一个 iOS 应用程序,也是我第一次使用 Realm。
像这样组织代码是否有意义(我发现这种方法的支持很少,但通常也很少,就工作时的 MVC 最佳实践而言与境界)
如果确实有意义,我如何解决从错误线程访问 Realm 的问题,同时仍然直接在对象 class 中执行 realm.write
s?
提前致谢! :)
西蒙
- 这样组织代码是没有意义的。您将只能从创建它的同一个线程写入
- 要修改来自不同线程的对象,您可以使用 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...])
干净多了。
如果您想保证对象在事务中写入,则会出现另一个问题——要么全部成功,要么全部失败。您当前的对象无法做到这一点。
最后一个问题是,您通常希望实例化一个对象并向其添加一些数据,在写入领域之前填充该对象。使用问题中的代码,您将在填充数据后立即编写它。您必须将相同的代码添加到每个 属性.
我正在使用某些对象的领域数据持久性编写一个应用程序。
为了清理 up/remodel 我的代码(从视图和控制器中获取 realm.write
s),我试图将它们直接放在持久对象 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.write
s。无论如何,就是这个想法。
这有时有效。其他时候,应用程序会因错误而崩溃...
"Realm accessed from incorrect thread"
...这就是我目前正在努力解决的问题。
这是我的第一个 iOS 应用程序,也是我第一次使用 Realm。
像这样组织代码是否有意义(我发现这种方法的支持很少,但通常也很少,就工作时的 MVC 最佳实践而言与境界)
如果确实有意义,我如何解决从错误线程访问 Realm 的问题,同时仍然直接在对象 class 中执行
realm.write
s?
提前致谢! :) 西蒙
- 这样组织代码是没有意义的。您将只能从创建它的同一个线程写入
- 要修改来自不同线程的对象,您可以使用 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...])
干净多了。
如果您想保证对象在事务中写入,则会出现另一个问题——要么全部成功,要么全部失败。您当前的对象无法做到这一点。
最后一个问题是,您通常希望实例化一个对象并向其添加一些数据,在写入领域之前填充该对象。使用问题中的代码,您将在填充数据后立即编写它。您必须将相同的代码添加到每个 属性.