gpt4 book ai didi

ios - 是否可以复制 Realm 对象?

转载 作者:可可西里 更新时间:2023-11-01 06:20:02 24 4
gpt4 key购买 nike

我想像这样在后台线程中刷新 Realm 数据库:(因为我从 Webservice 获得了新数据)

 RLMRealm *realm = [RLMRealm defaultRealm];
[realm beginWriteTransaction];
[realm deleteAllObjects]; // !!
[Pubs createOrUpdateInRealm:[RLMRealm defaultRealm] withJSONArray:data];
[realm commitWriteTransaction];

问题是,同时我删除并更新了 Realm 数据库中的对象,用户可以打开一些 Detail ViewController 指向一些同时被删除的 Realm 对象(Pubs),因此抛出异常。

我没有看到任何解决方案,除了当我想从 Detail Controller 或其属性访问 Realm 对象时,我总是需要做这样的事情:

(这意味着始终获取 Realm 对象,但这也可能会失败)

pub = [Pubs objectsWhere:[NSString stringWithFormat: @"pubId = %lu", (long)_selectedPubId]].firstObject;

但我没有使用这个解决方案。我想最好的办法是,如果我可以像这样调用 Detail View Controller :

pub = [Pubs objectsWhere:[NSString stringWithFormat: @"pubId = %lu", (long)_selectedPubId]].firstObject;
pub = [pub safeCopy];

因此可以同时删除PubRealmObject,但pub对象将单独存在于内存中(仅用于访问其数据属性)。

那么有人尝试过类似的东西吗?

或者甚至可以使用一些 iOS SDK 方式 like this

我只需要像我说的那样访问数据属性,而不是使用 Realm 对象方法(如删除或更新数据库中的对象)进行操作。

顺便说一句,我试图在主线程中调用 Realm 数据库的更新,但问题是它需要大约 5-7 秒(只有 1000 个 JSON 对象),所以它滞后于应用程序。这就是为什么我认为对象的后台更新和安全复制可能会更好。

但我认为即使在复制对象时它也可能会失败,那么解决这个问题的方法是什么? (后台更新与 Realm 对象的安全访问)

最佳答案

让 View Controller 依赖于可以从其下方删除的数据模型通常不是一个好的设计模式。可以通过检查其 object.invalidated 属性来检查 Realm 对象是否已被删除以避免异常。

无论如何,要创建 Realm 对象的分离副本,您需要做的就是:

RLMObject *copiedObject = [[RLMObject alloc] initWithValue:object];

这将创建对象的副本,但不会将其插入到任何 Realm 实例中。请注意,如果该对象链接到任何其他 Realm 对象,则这些对象也不会被复制;新对象将仅指向现有副本。

但我仍然觉得我需要提一下,您可能只是让您从 Web 服务更新 Realm 的实现更智能一些,以避免需要这样做。

如果你的对象实现了a primary key ,然后当您调用 createOrUpdateInRealm 时,现有对象将更新为新值。

祝你好运!

关于ios - 是否可以复制 Realm 对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38564603/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com