Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 直接使用领域对象还是映射到对象类?_Ios_Swift_Multithreading_Realm - Fatal编程技术网

Ios 直接使用领域对象还是映射到对象类?

Ios 直接使用领域对象还是映射到对象类?,ios,swift,multithreading,realm,Ios,Swift,Multithreading,Realm,我开始学习如何在我的项目中使用Realm,这很好,但我看到了一些缺点,就是线程问题,Realm的对象不是线程安全的,不能同时在多个线程上访问它,所以每当我从Alamofire检索一些数据时,我都将其映射到对象,保存它,然后把它带回VC计算一些变化,然后更新UI,我想在更新UI之前分派整个部分,但如果直接使用领域,我必须保留查询对象类 所以我想问一下,是继续查询领域并直接使用它,还是将其映射到不可变类或结构并在不同线程中使用所有领域服务更好?领域对象不是线程安全的,不能跨线程传递,这是正确的,但一

我开始学习如何在我的项目中使用Realm,这很好,但我看到了一些缺点,就是线程问题,Realm的对象不是线程安全的,不能同时在多个线程上访问它,所以每当我从Alamofire检索一些数据时,我都将其映射到
对象
,保存它,然后把它带回VC计算一些变化,然后更新UI,我想在更新UI之前分派整个部分,但如果直接使用领域,我必须保留查询
对象


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

领域对象不是线程安全的,不能跨线程传递,这是正确的,但一旦掌握了诀窍,在多线程环境中使用领域仍然非常容易

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

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

要了解更多信息,我建议查看领域的文档页面。我们目前还在研究一种方法,使在后台修改领域对象时更容易收到通知,以便自动触发UI更新


(免责声明:我为领域工作)

领域对象不是线程安全的,不能跨线程传递,这是正确的,但一旦掌握了窍门,在多线程环境中使用领域仍然非常容易。:)

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

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

要了解更多信息,我建议查看领域的文档页面。我们目前还在研究一种方法,使在后台修改领域对象时更容易收到通知,以便自动触发UI更新


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

仅更新此答案,从Realm 2.2开始(iOS、macOS等)您现在可以使用
ThreadSafeReference
而不是传递主键:我仍然会问,如果安全地处理,将领域对象映射到Swift对象是否有价值,或者这完全是浪费时间,永远不应该考虑?从领域2.2(iOS、macOS等)开始,只需更新这个答案即可您现在可以使用
ThreadSafeReference
而不是传递主键:我仍然会问,如果安全地处理,将领域对象映射到Swift对象是否有价值,或者这完全是浪费时间,永远不应该考虑?