저장 문맥 후 작동하지 :NSSortDescriptor 나는 다음과 같이 정의 NSManagedObjectContext에 GCD 파견 큐에서 작업을하고 있어요
NSManagedObjectContext *context = [[self alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];
[context setParentContext:[NSManagedObjectContext MR_defaultContext]];
return context;
후 :
- (NSManagedObjectContext *)backgroundContext
{
if (backgroundContext == nil) {
self.backgroundContext = [NSManagedObjectContext MR_contextThatNotifiesDefaultContextOnMainThread];
}
return backgroundContext;
}
MR_contextThatNotifiesDefaultContextOnMainThread
것은 MagicalRecord에서하는 방법입니다 내 객체를 가져 와서 올바른 대기열 위치를 지정하면 로그에 기록되고 순서가 올바른 것입니다. 그러나 두 번째 로그는 완전히 무작위로 보이며 정렬 설명자는 분명히 작동하지 않습니다.
문제점을 [self.backgroundContext save:&error]
으로 좁혔습니다. 배경 컨텍스트를 저장 한 후 정렬 설명자가 손상됩니다.
dispatch_group_async(backgroundGroup, backgroundQueue, ^{
// ...
for (FooObject *obj in fetchedObjects) {
// ...
obj.queuePosition = [NSNumber numberWithInteger:newQueuePosition++];
}
NSFetchRequest *f = [NSFetchRequest fetchRequestWithEntityName:[FooObject entityName]];
f.predicate = [NSPredicate predicateWithFormat:@"queuePosition > 0"];
f.sortDescriptors = [NSArray arrayWithObject:[NSSortDescriptor sortDescriptorWithKey:@"queuePosition" ascending:YES]];
NSArray *queuedObjects = [self.backgroundContext executeFetchRequest:f error:nil];
for (FooObject *obj in queuedObjects) {
DLog(@"%@ %@", obj.queuePosition, obj.title);
}
if ([self.backgroundContext hasChanges]) {
DLog(@"Changes");
NSError *error = nil;
if ([self.backgroundContext save:&error] == NO) {
DLog(@"Error: %@", error);
}
}
queuedObjects = [self.backgroundContext executeFetchRequest:f error:nil];
for (FooObject *obj in queuedObjects) {
DLog(@"%@ %@", obj.queuePosition, obj.title);
}
});
정렬 설명자가 작동하지 않는 이유는 모르겠지만 핵심 데이터 전문가는 도움을 원합니다.
업데이트 :
문제는 아이폰 OS 4에 나는 이유는 스레드 격리 및 개인 큐 모드의 차이 어딘가에 생각 발생하지 않습니다. MagicalRecord는 자동으로 다르게 동작하는 것처럼 보이는 새로운 동시성 패턴을 사용합니다.
업데이트 2 :
문제는 배경 컨텍스트의 선방을 추가하여 해결되었습니다
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);
}
}];
}
}
업데이트 3 :
MagicalRecord가 반복적으로 저장하는 방법을 제공을 문맥, 이제 내 코드는 다음과 같습니다 :
처음에 그것을 사용하지 않는 날부끄러운 ...
는 그러나, 나는이 도움이 이유을 모르는 및 설명을 얻을 싶어요.
귀하의 의견을 보내 주셔서 감사 드리며, 스레드 분리만을 사용하여 실험 해 보았습니다.하지만 iOS 5에서 개인 큐를 사용하고 싶습니다. 테스트 중에 버그를 발견했습니다. 부모 컨텍스트의 저장은 자식 컨텍스트의 스레드에서 호출되므로 GCD 컨텍스트에서 재귀 적으로 저장할 때 문제가 발생합니다. 내가 풀 요청을 제출했습니다 : https://github.com/magicalpanda/MagicalRecord/pull/159 – tim