Realm - Пакетное обновление RLMResults в фоновом потоке

У меня есть RLMResults, которые мне нужно перебрать, выполнить потенциально "длительную" задачу загрузки (достаточно долго, чтобы ее не было в главном потоке), и обновить каждый объект в результате этой загрузки. Последняя итерация того, что я предпринял (после поиска документов для ответа), выглядит примерно так, хотя, очевидно, это не работает так, как задумано, но является отправной точкой для демонстрационных целей:

RLMResults *objectsToSaveImagesFor = [self allObjectsToSaveImagesFor];
for (Object *object in objectsToSaveImagesFor) {
    RLMThreadSafeReference *objectRef = [RLMThreadSafeReference referenceWithThreadConfined:object];

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        RLMRealm *realm = [RLMRealm realmWithConfiguration:self.realm.configuration error:nil];

        Object *threadSafeObject = [realm resolveThreadSafeReference:objectRef];

        BOOL success = [self downloadImageForObject:threadSafeObject];

        [realm transactionWithBlock:^{
            threadSafeObject.imageSaved = success;
        }];
    });
}

Я попробовал около дюжины итераций по этому вопросу, и мне не удалось выяснить канонический способ Realm сделать то, что я хотел бы сделать, то есть загрузить большое количество изображений (в тысячах) и обновить каждое из моих Объекты области с результатом загрузки в фоновом потоке.

1 ответ

Решение

Вместо того, чтобы создавать и разрешать потокобезопасную ссылку для каждого объекта в RLMResultsПросто сделайте это один раз:

RLMResults *objectsToSaveImagesFor = [self allObjectsToSaveImagesFor];
RLMThreadSafeReference *objectsRef = [RLMThreadSafeReference referenceWithThreadConfined:objectsToSaveImagesFor];
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
    RLMRealm *realm = [RLMRealm realmWithConfiguration:self.realm.configuration error:nil];
    RLMResults *objectsToSaveImagesFor2 = [realm resolveThreadSafeReference:objectsRef];
    for (Object *object in objectsToSaveImagesFor2) {
      BOOL success = [self downloadImageForObject:threadSafeObject];
      [realm transactionWithBlock:^{
        object.imageSaved = success;
      }];
    }
});
Другие вопросы по тегам