直接使用Realm对象或映射到对象类?

时间:2016-04-12 04:43:22

标签: ios swift multithreading realm

我开始学习如何在我的项目中使用Realm,它很棒,但是我看到了一些缺点,就是线程问题,Realm的对象不是线程安全的,并且无法在多个线程上访问它时间,所以每当我从Alamofire中检索一些数据时,我将其映射到Object,保存,然后将其带回VC来计算一些更改,然后更新UI,我想在更新UI之前调度整个部分dispatch,但是如果直接使用Realm,我必须继续查询Object类。

所以我想问一下,更好地继续查询Realm并直接使用它,或者将它映射到不可变的类或结构并在不同的线程中使用所有Realm服务?

1 个答案:

答案 0 :(得分:2)

正确的做法是Realm对象不是线程安全的,不能跨线程传递,但是一旦你掌握了它,它仍然很容易在多线程环境中与Realm一起工作。 :)

当您在后台线程上对Realm实例提交一些更改时,主线程上的等效Realm实例将在运行循环的下一次迭代中自动更新这些更改。如果主线程上有任何Results列表(即,用于在UITableView中显示Realm对象),那么这些对象也将使用新对象/更改自动更新,因此您只需要要做的是确保您的UI刷新自己以应对这些更改。 (注意:对于其他线程中的Realm个实例,而不是主线程,您需要调用Realm.refresh()来明确提取这些更改。)

如果您正在使用显式的Realm模型Object并希望将其传递给另一个线程以继续在那里工作,那么最简单的方法是将其保存到Realm实例上当前线程,然后从新线程上的等效Realm实例重新获取。在这种情况下,建议您的Object架构包含primary key property,因为您可以跨线程传递此值,然后通过在新线程上调用Realm.objectForPrimaryKey()来重新获取相同的对象

有关详细信息,我建议您查看Realm文档页面上的Threading section。我们目前正在开发一种方法,以便在后台修改Realm对象时更容易收到通知,以便自动触发UI更新。

(免责声明:我为Realm工作)