iOS 在异步线程的 RLMArray 中添加对象时,应用程序崩溃

iOS app getting crash when adding object in RLMArray on async thread

这是对 Realm 对象的描述:- 我有一个对象 SLRProduct,它是 RLMObject 的子类。它包含一个 属性 条评论,即 SLRComment 的 RLMArray。 SLRComment 也是 RLMObject 的子类。

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
    RLMRealm *slRealm = [RLMRealm defaultRealm];
    [slRealm beginWriteTransaction];
    NSPredicate *pred = [NSPredicate predicateWithFormat:@"identifier = %@", productId];
    SLRProduct *product = [[SLRProduct objectsWithPredicate:pred] firstObject];
    [product.comments addObject:comment]; //<=== Getting crash here
    [slRealm commitWriteTransaction];
});

在这种方法中,我在 RLMArray 中添加了一个 SLRComment。当我在异步线程上执行此事务时,它会崩溃并出现异常 'Object is already persisted in a Realm'。它在主线程上运行良好。我需要以某种方式在异步线程上执行此操作。

我遇到了一些与您类似的问题,我试图在异步线程上更新 RLMObject 的一些字段。

我认为崩溃与访问 NSArray 没有严格关系,而是与修改对象本身的尝试有关。当您从 RLMRealm 检索 SLRProduct 的实例时,该实例会处理 cancel/modify 操作的并发性,因为您获得的同一对象的所有实例(例如,具有相同的主键)实际上是同一对象。 如果您从两个不同的 slRealm 获取它,并且您正在使用两个不同的 RLMRealms,因为您从两个不同的线程获取它们,应用程序将崩溃,因为它们无法处理访问。

我使用主队列 (dispatch_get_main_queue()) 解决了我的问题。

希望对您有所帮助