在同步时,我用服务器的数据覆盖我所有的本地数据。为此,我首先调用realm.delete(realm.objects(MyObj))
我所有的对象。然后我将响应的对象保存为realm.add(obj, update: false)
. 一切都在一次交易中。有效负载可能需要一段时间来处理,但不足以证明实施分页是合理的。
在此过程中用户能否正常使用该应用程序?他们是否可以存储在交易的清算部分被删除的新项目,或者在添加部分会触发错误或被覆盖的新项目?如果是,我该如何避免这种情况?
在同步时,我用服务器的数据覆盖我所有的本地数据。为此,我首先调用realm.delete(realm.objects(MyObj))
我所有的对象。然后我将响应的对象保存为realm.add(obj, update: false)
. 一切都在一次交易中。有效负载可能需要一段时间来处理,但不足以证明实施分页是合理的。
在此过程中用户能否正常使用该应用程序?他们是否可以存储在交易的清算部分被删除的新项目,或者在添加部分会触发错误或被覆盖的新项目?如果是,我该如何避免这种情况?
Realm 使用多版本并发控制算法。这使用锁来确保独占写入,而其他线程可以继续读取以前版本的数据。我们的博客上有一篇文章,它更深入地解释了它是如何工作的。
请注意,您在此处尝试解决的问题并非易事。
他们是否可以存储在交易的清算部分被删除的新项目,或者在添加部分会触发错误或被覆盖的新项目?
当后台事务正在进行时,其他写入事务将被阻止。如果您从主线程执行这些写入,您将阻塞主线程。如果您从后台线程执行它们,它们将排队并在您的同步事务完成后执行。
开始时被删除的对象将变得不可访问(您可以通过 进行检查invalidated
),因为写入事务始终在最新版本上运行。如果您的对象在您的同步操作中具有一致的主键,您可以利用它们重新获取它们并重做对新实例的所有修改。但请注意,在开始写入事务之前,您需要将主键(和所有其他对象数据)存储到内存中,这意味着隐式刷新。