ich Operationen in einer GCD Absende-Warteschlange auf einem NSManagedObjectContext folgendermaßen definiert tun:NSSortDescriptor von NSFetchRequest nicht nach Kontext Arbeits speichern
- (NSManagedObjectContext *)backgroundContext
{
if (backgroundContext == nil) {
self.backgroundContext = [NSManagedObjectContext MR_contextThatNotifiesDefaultContextOnMainThread];
}
return backgroundContext;
}
MR_contextThatNotifiesDefaultContextOnMainThread
ist eine Methode aus MagicalRecord:
NSManagedObjectContext *context = [[self alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];
[context setParentContext:[NSManagedObjectContext MR_defaultContext]];
return context;
Nach meine Objekte holen und ihnen die korrekte Schlangeposition geben ich log sie und die Reihenfolge ist korrekt. Das zweite Protokoll scheint jedoch völlig zufällig zu sein, der Sortierungsdeskriptor funktioniert eindeutig nicht.
Ich habe das Problem auf [self.backgroundContext save:&error]
eingegrenzt. Nach dem Speichern des Hintergrundkontexts sind die Sortierdeskriptoren unterbrochen.
Ich habe keine Ahnung, warum der Sortierungsdeskriptor nicht funktioniert, wollen irgendwelche Kerndatenexperten helfen?
Update:
Das Problem tritt nicht auf iOS 4. Ich denke, der Grund, irgendwo zwischen Thread Isolation und privaten Warteschlange Modi in der Differenz ist. MagicalRecord verwendet automatisch das neue Concurrency-Muster, das sich unterschiedlich zu verhalten scheint.
Update 2:
Das Problem wurde gelöst Speichern des Hintergrundkontext durch eine Zugabe:
if ([[NSManagedObjectContext MR_contextForCurrentThread] hasChanges]) {
DLog(@"Changes");
NSError *error = nil;
if ([[NSManagedObjectContext MR_contextForCurrentThread] save:&error] == NO) {
DLog(@"Error: %@", error);
} else {
NSManagedObjectContext *parent = [NSManagedObjectContext MR_contextForCurrentThread].parentContext;
[parent performBlockAndWait:^{
NSError *error = nil;
if ([parent save:&error] == NO) {
DLog(@"Error saving parent context: %@", error);
}
}];
}
}
Update 3:
MagicalRecord bietet eine Methode rekursiv speichern ein Kontext, jetzt sieht mein Code so aus:
if ([[NSManagedObjectContext MR_contextForCurrentThread] hasChanges]) {
DLog(@"Changes");
[[NSManagedObjectContext MR_contextForCurrentThread] MR_saveWithErrorHandler:^(NSError *error) {
DLog(@"Error saving context: %@", error);
}];
}
Schande über mich für ihn nicht in erster Linie mit ...
aber ich weiß nicht, warum dies hilft, und würde gerne eine Erklärung erhalten.
Vielen Dank für Ihre Eingabe, ich experimentierte noch mehr mit Thread-Isolation, aber ich würde lieber private Warteschlangen auf iOS 5 verwenden. Während des Testens denke ich, dass ich einen Fehler gefunden habe. Das Speichern des übergeordneten Kontexts wird für den Thread des untergeordneten Kontexts aufgerufen, was zu Problemen beim rekursiven Speichern aus einem GCD-Kontext führt. Ich habe eine Pull-Anfrage gesendet: https://github.com/magicalpanda/MagicalRecord/pull/159 – tim