2012-07-29 3 views
1
iOS5를, 나는 내가하는 NSPrivateQueueConcurrencyType로 만들 그래서 같은 NSManagedObjectContext이

:NSManagedObjectContext는 주 스레드에서 블록을 실행

self.moc = [[[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType] autorelease]; 
moc.parentContext = rootContext; 

이 주 스레드에서 실행하지만을 나는 문서를 이해한다면 문제가되지 않아야합니다. MOC가 자체 대기열을 얻었으니까요?

지금, 어떤 점에서 나는과 같이, 페치 요청을 수행 :

[self.moc performBlockAndWait:^() { // (1) 
    NSError* err = nil; 

    result = [self.moc executeFetchRequest:request error:&err]; 

    NSLog(@"%@ %@", [NSThread currentThread], [NSThread isMainThread][email protected]"MAIN":@""); 
}]; 

호출이나 (1)도 기본 스레드에서 호출됩니다. 하지만 블록 내부의 가져 오기 요청은 개인 MOC 스레드에서 실행되기를 기대합니다. 지금까지 수정?

그러나 블록 내부의 현재 스레드를 확인하면 실제로는 주 스레드입니다! NSLog는 다음을 인쇄합니다.

<NSThread: 0x6b10780>{name = (null), num = 1} MAIN 

스레드 덤프를 확인하면이를 확인할 수 있습니다.

주 스레드에서 패치를 실행해서는 안되며, 다른 실행 코드와 교착 상태가 발생할 수 있습니다. 여기서 내가 뭘 잘못하고 있니?

답변

0

좋아, 나는 아직도 여기에 기계공에 관하여, 그러나 문맥 개인 큐에 배치 된 무언가가 주요 실에 어떻게 끝나는 지 아직도 확실하지 않다. 나는 performBlockAndWait와 관련이 있다고 생각한다. performBlockAndWait은 동 기적으로 블록을 실행한다. 이제는 모든 것을 비동기 적으로 완료하고 블록은 이제 비공개 스레드에서 실행되도록 항목을 다시 작성했습니다.

모든 제안에 감사드립니다.

+0

위의 대답을 다시 읽으십시오. 개인 MOC 대기열이 없습니다. NSPrivateQueueConcurrencyType 플래그는 코어 데이터를 사용하는 방법을 알려주는 것입니다. 큐를 생성하지는 않습니다. 위의 코드에서 수행중인 모든 작업이 기본 대기열에 있습니다. –

+0

위의 잘못된 정보를 편집하려고 시도했지만 시간이 초과되었습니다. 나의 수정 : 나의 정보는 iOS 4이었다 - 혼란에 유감스럽게 생각한다. 어떤 경우에는 MOC가 대기열에서 작업을 수행하고 있으며, 사용자에게 편리함을 전하는 메시지 스레드와 동일한 스레드에 다시 메시징을 보내는 것이 무엇이든지 생각합니다. 그래서 당신이 작업을 수행하도록 요청한 이후 그것을 기다리고 (performBlockAndWait), 스레드에서 작업을 수행하지만 메인 스레드를 차단합니다. 이 메시지의 직전과 직후에 기록하고이 가설을 시험하기 위해 시차를 기록 할 수 있습니다. –

+0

그 고마워. 나는 다시 한 번 문서에서 찾았습니다. NSPrivateQueueConcurrencyType을 지정할 때 "컨텍스트가 개인 큐를 만들고 관리합니다."라는 것을 분명히 말합니다. 네가 묘사 한 것과 같은 일이 벌어지고있는 것 같아. 어쨌든 이제 제대로 작동합니다. – radnoise

관련 문제