我开始学习如何在我的项目中使用Realm,它很棒,但是我看到了一些缺点,就是线程问题,Realm的对象不是线程安全的,并且无法在多个线程上访问它时间,所以每当我从Alamofire中检索一些数据时,我将其映射到Object
,保存,然后将其带回VC来计算一些更改,然后更新UI,我想在更新UI之前调度整个部分dispatch,但是如果直接使用Realm,我必须继续查询Object
类。
所以我想问一下,更好地继续查询Realm并直接使用它,或者将它映射到不可变的类或结构并在不同的线程中使用所有Realm服务?
答案 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工作)