2012-03-10 2 views
1

코어 데이터를 사용하지만 HTTP를 통해 서버와 데이터를 동기화하는 앱을 작성하고 있습니다. 데이터의 변경 내용에 응답 할 수 있도록 NSManagedObjectContext의 알림을 모니터링하고 있습니다.특정 NSManagedObjectContext 저장 작업에서 알림을 식별하는 방법은 무엇입니까?

최초 응답을 기반으로 업데이트 : 제안 해 주셔서 감사합니다. 내가 더 설명해야 할 것 같습니다 : 애플 리케이션에서 코어 데이터를 사용하고 있지만 서버에 변경 사항을 게시하고, 관리 대상 객체 컨텍스트에서 알림을 모니터링합니다.

동시에 정기적으로 서버를 폴링합니다. 변경 사항이 서버에서 내려 오면 그에 따라 Core Data 객체를 업데이트합니다. 그러나이 경우 이므로 새로 변경된 로컬 데이터를 서버에 게시하는 것을 피하고 싶습니다. (처음부터 서버가 있던 곳이기 때문에). 즉, 인식하고 무시하고 싶다는 알림을 받으면 저장 작업 또는에 대한 알림을 표시하지 않겠습니까?

저는 현재 동시성이나 스레드에 대해 아무 것도하지 않습니다. 즉, 관리 객체 컨텍스트의 저장 알림이 내 저장 작업과 동일한 순서로 들어올 수 있다는 것을 의미하는 경우 해당 저장 전에 플래그를 간단히 설정할 수 있습니다. 그게 효과가 있니?

(만약 내가 미래에 비동기 적으로 작업하고 싶다면 여전히 지저분 해 보인다. 알림을 특정 저장 작업에 연결하거나 해당 저장 통지를 모두 표시하지 않는 것이 더 좋을 것이다.)

+0

내 새로운 대답을 참조하십시오. – spudwaffle

답변

1

이것은 매우 흥미로운 질문입니다!

멀티 스레딩을 사용하지 않는 경우 BOOL 플래그를 사용한다고 말합니다.

멀티 스레딩 및 10.6+를 사용하는 경우 동일한 동시 Grand Central Dispatch (또는 GCD) 직렬 대기열에서 모든 플래그 (플래그 설정 포함) 작업을 수행해야합니다.

당신과 같이 해당 대기열을 설정할 수 있습니다 : 해당 대기열에

dispatch_queue_t dataQueue = dispatch_queue_create("Data Queue", DISPATCH_QUEUE_SERIAL); 

그런 다음 실행할 수있는 코어 데이터 조작을 사용 :

dispatch_async(dataQueue, ^{ 
    //do work here 
}); 

큐를 해제하는 것을 잊지 마세요 때 ' 그것으로 다 다시 :

dispatch_release(dataQueue); 

dataQueue 아마도 바르로 또는 GL로 사용될 수 obal 변수는 일부 + 메소드를 통해 액세스합니다.

대기열로 전송 된 모든 작업은 순차적으로 (제출 된 순서대로) 실행되므로 모든 것이 동일한 대기열로 보내지면 스레드 안전 문제가 없어야합니다.

Concurrency Programming Guide에서 그랜드 센트럴 디스패치 (개인적으로는 멋진 API라고 생각합니다)를 읽으십시오.

0

spudwaffle에 따르면 알림 개체의 개체 포인터에서 컨텍스트를 가져올 수 있다고 나와 있습니다.

병합 콜백 방법은 다음과 같습니다

- (void)mergeChanges:(NSNotification *)notification { 
    if (notification.object != self.context) { 
     [self.context mergeChangesFromContextDidSaveNotification:notification]; 
    } 
} 
+0

제안 해 주셔서 감사합니다. 내 질문에 더 명확해질 필요가있는 것처럼 들리네 ... 위에 업데이트되었습니다. –

관련 문제