2012-07-14 4 views
7

NSOperationQueue을 사용하여 CoreData 작업을 전달하려고합니다. 그러나 작업 대기열 동작이 항상 동일하지는 않습니다 (예 : 스레드 풀을 사용하는 iOS 4.0/OS 10.6에서 libdispatch을 사용하여 발송). 대기열이 항상 동일한 스레드 (예 : NSManagedObjectContext 필요)를 사용하지는 않습니다.NSOperationQueue 지정된 스레드

NSOperationQueue을 단일 스레드에서 강제로 실행할 수 있습니까? 아니면 간단한 큐잉 메커니즘을 만들어야합니까?

+0

당신은 알 필요하지 않을 수도 있습니다 당신의 작업이 어떤 스레드에서 실행되고 있는지. 문맥을 잠그고 ('- [context lock]'을 사용하여) 일단 완료되면 잠금을 해제 할 수 있습니다. 잠긴 블록에서 Core Data 속성에 액세스하지 않도록주의하십시오. 컨텍스트 동기화가 필요하지 않도록 최대 동시 작업을 1로 설정하는 것을 잊지 마십시오. – cdelacroix

답변

3

강제로 단일 스레드에서 NSOperationQueue를 실행할 수 있습니까? 아니면 간단한 큐잉 메커니즘을 만들어야합니까?

두 가지 중 하나를 수행 할 필요가 없습니다. 핵심 데이터가 실제로 필요로하는 것은 관리 대상 객체 컨텍스트 에 동시에 변경하는 코드 두 개가 없으므로입니다. 심지어 노트 Concurrency with Core Data의 맨 처음에이에있다 :

참고 : 당신은 동시성 스레드, 일련 작업 큐, 또는 파견 큐를 사용할 수 있습니다. 간결성을 위해이 기사에서는 이들 중 하나를 가리키는 데 "스레드"를 사용합니다.

실제로 필요한 것은 주어진 컨텍스트에서 작업을 직렬화하는 것입니다. 단일 스레드를 사용하는 경우 자연스럽게 발생하지만 NSOperationQueue는 maxConcurrentOperationCount을 1로 설정하면 해당 작업을 직렬화하므로 모든 스레드가 동일한 스레드에서 발생하지 않도록 걱정할 필요가 없습니다.

+4

경고 :이 대답은 '잘못'입니다! Coredata는 스레드 당 하나의 컨텍스트가 필요합니다 (실제 것들!) –

+0

스레드 당 MOC가 필요하다고 생각 했습니까? – ruipacheco

+0

@Dominick, 귀하의 주장에 대한 권위있는 참조를 제공해주십시오. 내 답변의 정보는 Apples docs에서 직접 가져 왔으며 동일한 아이디어가 여러 번 WWDC에서 반복되었습니다. – Caleb

-1

애플은 다른 스레드의 컨텍스트에 액세스 할 수 더 이상 안전한 것으로 밤은 .. 실제 스레드로 관리되는 개체를 결합하기로 결정 - 어떤 물체가없는 상황이 안전 할 수 있지만 그 객체가 아닌

+0

다시 한 번 참조하십시오. 귀하의 조언은 여기 Core Data 문서와 모순되며 iOS 6 SDK 릴리스 노트에서 귀하의 답변을 뒷받침 할만한 내용은 없습니다. 그럼 어디에서 정보를 얻고 있습니까? – Caleb

+0

위의 답에서 문서를 참조하십시오.) google .. 예 : http://stackoverflow.com/questions/67154/is-it-safe-to-manipulate-objects-that-i-created-outside-my- thread-if-i-dont-exp –

+0

한숨 .. 왜 투표가 늦춰 졌습니까? 적어도 그것을 설명하기 위해 몇 초를 보내십시오. –