2013-10-10 1 views
0

개요 : 백그라운드에서 실행되는 새로 고침 프로세스가 있으며 (performInBackground 만 사용하는 것) 그 중 일부에는 db 업데이트가 있으므로 백그라운드 스레드 용 별도의 MOC 그런 다음 didSave 알림을 사용하여 변경 사항을 병합하지만 DB/내 UI에 이러한 업데이트가 표시되지 않습니다. 저장 전후에 객체 자체를 로깅했는데 속성이 변경된 것을 볼 수 있지만 알림에 의해 호출 된 메소드에서받은 객체의 객체를 기록하고 값을 업데이트하지 않습니다. 아마 다른 것들은 추한 것일 수도 있지만이 핵심 데이터 조각을 찾으려하고 있습니다. 나는 이전에 단 하나의 MOC를 가지고 있었고 일들이 잘되었지만 (비 핵심 데이터는 괜찮을 것입니다.) 저는 배경에있는 것들을 재구성했고 개별 MOC의 지침을 사용하기를 원했습니다.백그라운드에서 핵심 데이터 : 별도의 컨텍스트 및 알림 사용, 새 값으로 DB 업데이트 안 함

컨텍스트 만들기, 알림 설정, 속성 설정 및 저장. 포스트 나는이 전송 된 MOC를 확인하고 내가 만든 더 업데이트, 병합이 발생하면 모든 값이 그래서 1입니다 볼, 값이 여기에 0

// this creates context with same PSC as main MOC 
    NSManagedObjectContext *context = [[MyAppDelegate application] temporaryContext]; 

[[NSNotificationCenter defaultCenter] addObserver:(MyAppDelegate *)[[UIApplication sharedApplication] delegate] 
             selector:@selector(managedObjectContextDidSave:) 
              name:NSManagedObjectContextDidSaveNotification 
              object:context];     
NSLog(@"value is %d", [[myObject email] boolValue]); //value is 1 
[myObject setEmail:[NSNumber numberWithBool:![[myObject email] boolValue]]]; 
NSError *error;  
if (![context save:&error]) { 
    NSLog(@"Error in saving BriefCase object - error:%@" ,error);  
} 
NSLog(@"value is %d", [[myObject email] boolValue]); //value is 0 now 

이다, 저장합니다. 저장 후 개체에 0이있는 것을 보면 연결이 끊어집니다.

// Called when a ManagedObjectContext performs save operation 
- (void)managedObjectContextDidSave:(NSNotification *)notification { 
    NSManagedObjectContext *receivedMOC = [notification object]; 
    NSArray *items = [MyObjectClass getAllMyObjectsInManagedObjectContext:receivedMOC]; 
for (int i=0; i < [items count]; i++) { 
    NSLog(@"value is %d", [[[items objectAtIndex:i] email] boolValue]); 
} 

시 추가 컨텍스트 생성 코드, 내가 통지를 처리 ​​할 때

[mainMOC mergeChangesFromContextDidSaveNotification:saveNotification]; 

를 호출이 표시되지 않는 문제

- (NSManagedObjectContext *)temporaryContext { 

NSManagedObjectContext *newContext = [[[NSManagedObjectContext alloc] init] autorelease]; 
NSPersistentStoreCoordinator *psc = [self.managedObjectContext persistentStoreCoordinator]; 
[newContext setUndoManager:nil]; 
[newContext setPersistentStoreCoordinator:psc]; 
return newContext; 
+0

1) 코드에서 실제 병합을 볼 수 없습니다. - 2) myObject의 출처는 어디입니까? –

+0

답장을 보내 주셔서 감사합니다. 죄송합니다, 나는이 후에 병합을 가지고 있지만, 내가 알았던 내용은 알림에서받은 컨텍스트가 변경되지 않았다는 것입니다. 병합은 잘 작동하지만 변경 사항을 병합하지 않으면 컨텍스트가 발생하지 않습니다. – skinsfan00atg

+0

myObject는 어디에 생성 되었습니까? –

답변

1

temporaryContext은 각 호출마다 새로운 MOC를 생성하므로 실제로 두 개의 다른 배경 MOC를 사용하는 것으로 보입니다. myModel

NSManagedObjectContext *context = [[MyAppDelegate application] temporaryContext]; 

따라서 후자 저장 상이한 myModel의 변화에 ​​영향을 미치지 않는 MOC에 생성된다.

임시 컨텍스트가 하나만 만들어지고 전달되도록 코드를 수정해야합니다.

+0

감사합니다! 나는 이것이 이것이라고 생각한다. 코드 작업이 아프다! – skinsfan00atg

+0

다시 한 번 감사의 말씀을 전하고 싶습니다. 그러나 나는 때때로 모든 자물쇠를보고있다. 자물쇠 앞에 호출 된 메서드를 보면 주 MOC에 액세스하는 무언가가 있습니다. 새로 고침 프로세스의 아무 것도이 작업에 액세스하지 않으며 모든 것이 백그라운드 MOC에 액세스합니다. 하지만 배경 MOC에 대한 변경 사항이 didSave 알림을 사용하여 주 MOC에 병합됩니다. MergeChangesFromContextDidSaveNotification을 수행하는 동안 하나의 MOC를 쿼리하려고하면 문제가 발생합니까? 아니면 그것을 처리하기 위해 만들어 졌는가? – skinsfan00atg

0

수 있습니다. 이것은 무슨 일이 일어 났는지 설명 할 수 있습니다. 이것은 메인 스레드에서 호출되어야합니다.

+0

위의 temporaryContext 코드를 붙여 넣었습니다. mergeChangesFromContextDidSaveNotification이 주 컨텍스트에서 호출되어야한다고 생각합니다. –

+0

@ MartinR : 고마워. 그게 내 뜻이야. 하지만 너무 많이 생각하지 않고 너무 많은 답변을 사용자 지정하려고 ... – sergio

+0

답장을 보내 주셔서 감사합니다. sergio, 모든 질문에 대해 사과드립니다! 나는이 후에 병합을했지만, 내가 알았던 것은 알림에서받은 컨텍스트가 변경되지 않았다는 것이었다. 병합은 잘 작동하지만 변경 사항을 병합하지 않으면 컨텍스트가 발생하지 않습니다. – skinsfan00atg