2017-03-11 3 views
1

Ich habe RLMResults, die ich durchlaufen muss, eine potenziell "lang laufende" Download-Aufgabe, (lange genug sollte es nicht auf dem Haupt-Thread sein), und jedes Objekt aktualisieren mit dem Ergebnis dieses Downloads. Die neueste Iteration auf dem, was ich versucht habe (nach der Dokumentation für eine Antwort Scheuern) ist so etwas wie dies, obwohl dies offensichtlich nicht wie beabsichtigt funktioniert, aber es ist ein Ausgangspunkt für Demonstrationszwecke:Realm - Batch update RLMResults auf Hintergrund thread

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

I Ich habe etwa ein Dutzend Wiederholungen dafür versucht und es wird mir nicht gelingen, den kanonischen Realm-Weg zu finden, was ich tun möchte, nämlich eine große Anzahl von Bildern herunterzuladen (zu Tausenden) und jedes meiner Realms zu aktualisieren Objekte mit dem Ergebnis des Downloads auf einem Hintergrundthread.

Antwort

1

Anstatt erstellen und eine Thread-sichere im RLMResults für jedes Objekt Referenz lösen, tun Sie es einfach einmal:

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

Es mir nicht ein hast du eine Thread-sichere Bezug auf die gesamte bekommen könnte RLMResults ... Das ist es, danke! – Mike

Verwandte Themen