2016-05-05 6 views
0

Daten im Hintergrund-Thread hole ich die Daten aus meinem Tisch ohne Ausgabe Folders wie dieseWie holen Für normale Instanz in MagicalRecord

+ (void)getCurrentFolderFileForParentFolderID:(NSString *)parentFolderID sortBy:(NSString *)sortBy asending:(BOOL)asending withCompletionHandler:(void(^)(id response,NSError *error))completionHandler { 
NSPredicate *filter = [NSPredicate predicateWithFormat:@"parentfolderidlocal = %@", parentFolderID]; 
NSArray *folders = [Folders MR_findAllSortedBy:sortBy ascending:asending withPredicate:filter]; 
NSArray *files = [Files MR_findAllSortedBy:sortBy ascending:asending withPredicate:filter]; 
completionHandler(@{@"folders":folders,@"files":files},nil); 
} 

Es arbeitet superfeine bin holen, aber wenn ich versuche zu holen die Daten von Hintergrund ich ein seltsames Problem habe, habe ich folgende Möglichkeiten versucht, die Daten im Hintergrund Warteschlange immer gleiche Problem die ganze Zeit

Process One zu holen: aufrufen es in einer Absende-Warteschlange

dispatch_async(fileSystemBackGroundQueue(), ^{ 
    [DataBaseManager getCurrentFolderFileForParentFolderID:parentFolderID sortBy:sortBy asending:asending withCompletionHandler:^(id response, NSError *error) { 
     dispatch_async(dispatch_get_main_queue(), ^(void){ 
       completionHandler(response, error); 
      }); 
    }]; 
}); 

wo fileSystemBackGroundQueue() als

dispatch_queue_t fileSystemBackGroundQueue() { 
static dispatch_once_t queueCreationGuard; 
static dispatch_queue_t queue; 
dispatch_once(&queueCreationGuard, ^{ 
    queue = dispatch_queue_create("com.myappname.filesystem.backgroundQueue", DISPATCH_QUEUE_SERIAL); 
}); 
return queue; 
} 

Prozess Zwei folgen: Mit lokalem Kontext für magischen Rekord

+ (void)getCurrentFolderFileForParentFolderID:(NSString *)parentFolderID sortBy:(NSString *)sortBy asending:(BOOL)asending withCompletionHandler:(void(^)(id response,NSError *error))completionHandler { 
NSManagedObjectContext *localContext = [NSManagedObjectContext MR_context]; 
NSPredicate *filter = [NSPredicate predicateWithFormat:@"parentfolderidlocal = %@", parentFolderID]; 
NSArray *folders = [Folders MR_findAllSortedBy:sortBy ascending:asending withPredicate:filter inContext:localContext]; 
NSArray *files = [Files MR_findAllSortedBy:sortBy ascending:asending withPredicate:filter inContext:localContext]; 
completionHandler(@{@"folders":folders,@"files":files},nil); 
} 

oder

+ (void)getCurrentFolderFileForParentFolderID:(NSString *)parentFolderID sortBy:(NSString *)sortBy asending:(BOOL)asending withCompletionHandler:(void(^)(id response,NSError *error))completionHandler { 
NSManagedObjectContext *localContext = [NSManagedObjectContext MR_context]; 
[localContext performBlock:^{ 
    NSPredicate *filter = [NSPredicate predicateWithFormat:@"parentfolderidlocal = %@", parentFolderID]; 
    NSArray *folders = [Folders MR_findAllSortedBy:sortBy ascending:asending withPredicate:filter inContext:localContext]; 
    NSArray *files = [Files MR_findAllSortedBy:sortBy ascending:asending withPredicate:filter inContext:localContext]; 
    dispatch_async(dispatch_get_main_queue(), ^(void){ 
     completionHandler(@{@"folders":folders,@"files":files},nil); 
    }); 
}]; 
} 

und Aufruf es in Absende-Warteschlange, wie oben oder mit aus Absendewarteschlange

In allen drei Fällen für die Hintergrund-Thread I das folgende Problem habe, während die Daten in einer Tabellenansicht Zelle für Zeile bei Index Pfad:

In normale Instanz es funktioniert gut, ich erhalte die folgendeMain Thread Result

aber für Hintergrund-Thread ich erhalte das Objekt aber keinen Wert (einige Male ich bin Wert bekommen obwohl)

Back Ground Fetch response

Bitte kann jeder helfen. Ich stecke hier fest. Ich brauche hier die Versandwarteschlange. Ich habe nicht so viel Wissen über Hintergrund Threading/Versand. Bitte lassen Sie mich wissen, wenn ich hier etwas falsch mache.

Antwort

0

Bei dieser Frage geht es nicht um MagicalRecord, es geht um CoreData.
Zwei Tipps: 1. Speichern Sie im persistenten Speicher, bevor Sie von einem anderen Thread abrufen;
2. Verwaltetes Objekt kann nur in dem Thread verwendet werden, in dem Sie es abrufen.

+0

hast du die ganze Frage gelesen? – souvickcse

Verwandte Themen