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;
}];
}
});