Приложение iOS получает сбой при добавлении объекта в RLMarray в асинхронном потоке

Вот описание объекта Realm: - У меня есть один объект SLRProduct, который является подклассом RLMObject. Он содержит комментарии к одному свойству: RLMarray из SLRComment. 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];
});

В этом методе я добавляю еще один SLRComment в RLMArray. Когда я выполняю эту транзакцию в асинхронном потоке, происходит сбой с исключением "Объект уже сохранен в области". Он отлично работает в основном потоке. Как-то мне нужно сделать это в асинхронном потоке.


person Ravi Prakash    schedule 24.07.2015    source источник
comment
вам нужно использовать блокировку для обработки addObject в изменяемом массиве.   -  person jinhua liao    schedule 24.07.2015
comment
Хм, это действительно любопытно. Единственное, что мне приходит в голову, это то, что этот объект каким-то образом сохраняется в другом Царстве, отличном от того, что используется по умолчанию. Как изначально создаются/сохраняются объекты комментариев?   -  person TiM    schedule 24.07.2015


Ответы (1)


У меня была проблема, похожая на вашу, я пытался обновить некоторые поля RLMObject в асинхронном потоке.

Я думаю, что сбой связан не столько с доступом к NSArray, сколько с попыткой модифицировать сам объект. Когда вы извлекаете экземпляр SLRProduct из RLMRealm, он обрабатывает параллелизм операций отмены/изменения, поскольку все экземпляры одного и того же объекта (например, с одним и тем же первичным ключом) фактически являются одним и тем же объектом. Если вы получаете его из двух разных slRealm и используете два разных RLMRealms, так как вы получаете их из двух разных потоков, приложение рухнет, потому что они не могут обработать доступ.

Я решил свою проблему, используя основную очередь (dispatch_get_main_queue()).

Я надеюсь это тебе поможет.

person Zeb    schedule 02.09.2015
comment
Да, это не было связано с NSArray. Я пытался изменить объект в другом потоке. - person Ravi Prakash; 09.09.2015