我想在后台线程中刷新Realm数据库,如下所示:(因为我从Webservice获得了新数据)
RLMRealm *realm = [RLMRealm defaultRealm];
[realm beginWriteTransaction];
[realm deleteAllObjects]; // !!
[Pubs createOrUpdateInRealm:[RLMRealm defaultRealm] withJSONArray:data];
[realm commitWriteTransaction];
问题是,同时我删除并更新了Realm db中的对象,用户可以打开一些Detail ViewController,指向一些同时被删除的Realm对象(Pubs),以便抛出异常 .
我没有看到任何解决方案,除非总是当我想从Detail控制器或其属性访问Realm对象时,我需要总是这样做:
(这意味着总是获得Realm对象,但这可能也会失败)
pub = [Pubs objectsWhere:[NSString stringWithFormat: @"pubId = %lu", (long)_selectedPubId]].firstObject;
但我没有使用这个解决方案 . 我想最好的是如果我可以在详细信息视图控制器中调用这样的东西:
pub = [Pubs objectsWhere:[NSString stringWithFormat: @"pubId = %lu", (long)_selectedPubId]].firstObject;
pub = [pub safeCopy];
因此可以同时删除PubRealmObject,但pub对象将独立存在于内存中(仅用于访问其数据属性) .
有人试过类似的东西吗?
或者甚至可能使用一些iOS SDK方式like this?
我只需要像我说的那样访问数据属性,而不是使用删除等领域对象方法或更新数据库中的对象 .
顺便说一句,我试图在主线程中调用Realm db的更新,但问题是需要5-7秒(只有1000个json对象),所以它滞后于应用程序 . 这就是为什么我认为对象的后台更新和安全复制可能会更好 .
但我认为即使在复制对象时它也会失败,那么解决方案是什么呢? (后台更新与Realm对象的安全访问)
1 回答
它可以通过检查
object.invalidated
属性来检查是否已删除Realm对象以避免异常 .无论如何,要创建Realm对象的分离副本,您需要做的就是:
这将创建对象的副本,但不会将其插入任何Realm实例 . 请注意,如果对象链接到任何其他Realm对象,则不会复制这些对象;新对象将指向现有副本 .
但我仍然觉得我需要提一下,你可能只是让你的Web服务更新Realm的实现更加智能,以避免需要这样做 .
如果对象实现a primary key,则在调用
createOrUpdateInRealm
时,将使用新值更新现有对象 .祝好运!