0

잠시 동안 MOC 및 대기열을 처리 한 후에도 올바른 방법으로 대기열에 MOC를 사용하는 방법을 잘 모르겠습니다. 나는 별도로 MOC의 각 유형을 해결할 수 있습니다 :NSManagedObjectContext 및 대기열

NSMainQueueConcurrencyType

이것은 실제로 간단합니다. 그것은 메인 큐에서 실행되어야한다고 말합니다. 이는 [context performBlock:block]을 사용하거나 메인 스레드를 직접 형성하여 사용할 수 있습니다.

코드가 주 스레드에서 실행되는 경우 블록 기반 API 대신 직접 주 큐 스타일 컨텍스트에서 메서드를 호출 할 수 있습니다. NSConfinementConcurrencyType

그 문맥 즉, 큐에 대해도 직렬 사람을 의미합니까 당신이 그것을

을 생성하는 것보다 다른 스레드에 의해 사용되지 않습니다 그 항상 같은 스레드를 사용하겠다고 약속하지 않습니까?

NSPrivateQueueConcurrencyType

컨텍스트 만들고

내가 [context performBlock:block]를 통해 모든 처리를 위해이 큐를 사용해야합니까 개인 큐를 관리?

NSMainQueueConcurrencyType과 비슷한 방식으로 정의한 단일 직렬 대기열에서 직접 사용할 수 있습니까?

또는 다른 말로

는 다음을 수행하는 것이 안전합니다 :

NSOperationQueue *workQueue = [[NSOperationQueue alloc] init]; 
workQueue.maxConcurrentOperationCount = 1; 

[workQueue addOperationWithBlock:^{ 
    // It just creates a new MOC with some parent 
    _context = [SUDataManager createChildContext]; 
    // .... Do things with context without [_context performBlock:block]... 
}]; 
+0

아래 답변은 해결책을 제공 했습니까? – SwiftArchitect

답변

0

사용 블록!

내가 정확히 반대 할 제안합니다

: 항상 블록 방법을 사용하고, 여기에 이유 : 각 작업이 예약하고 다음 이전에 완료되는

블록을 보장합니다. if() {} 뒤에 {및}을 사용하는 것과 조금 비슷합니다. 이 방법을 사용하면 소스 형식화로 인한 오류에 구속되지 않으며 의도 한 내용을 작성하고 실행하고 있는지 확인할 수 있습니다.

블록을 performBlockAndWait으로 결합하면 인 경우에만 을 실행할 수 없습니다. 달리해야 할 좋은 이유가 없으면 iCloud를 절약하고 디버깅하는 데 많은 시간을 할애하지 않는 한 매번 강력한 방법을 선택합니다.

예 :

[self.mainMOC performBlockAndWait:^{ 
    __strong myClass * strongSelf = weakSelf; 
    if(strongSelf) { 
     if([strongSelf.mainMOC hasChanges]) { 
      NSError *error = nil; 
      [strongSelf.mainMOC save:&error]; 
     } 
    } 
}]; 

동시성 유형

  1. 메인 스레드를 선택해야할지 : NSMainQueueConcurrencyType
  2. 다른 스레드를 사용합니다`NSPrivateQueueConcurrencyType를 사용합니다.

당신이 기술적으로 메인 스레드에 대한 NSConfinementConcurrencyType을 사용하고, 전적으로 유산에 대한 가능성이 수 있지만, 그것은이 MainQueue PrivateQueue 모델에서 필요하지 않습니다. 당신의 배경 스레드 (들)에서 설정 배경 스레드

에, 부모 컨텍스트를 설정하는 방법

. 그렇게하고 조언을 따르는 경우 모든 작업은 순서대로 수행되고 다음 작업이 완료되기 전에 완료되어 데이터 안정성을 보장합니다. iCloud는 손상시키려는 환경이 아닙니다 ...

self.privateMOC = [[NSManagedObjectContext alloc] 
    initWithConcurrencyType:NSPrivateQueueConcurrencyType]; 
[self.privateMOC setParentContext:mainMOC]; 
[self.privateMOC setMergePolicy:NSMergeByPropertyObjectTrumpMergePolicy]; 
+0

최근 편집을 참조하십시오. – Xyand

+0

'NSConfinementConcurrencyType'을 사용하면 메시지를 직접 보낼 수 있습니다. 단지 하위 호환성 *을 위해 존재합니다. 게다가, 당신은'performBlock :'과'performBlockAndWait :'*와 함께 큐 기반 동시성 유형을 사용하여 컨텍스트를 사용합니다. * NSOperation을 사용한다면 main (직렬 대기열의 경우) 또는 start (동시 대기열의 경우)에 컨텍스트를 생성해야합니다. * 예제에서, [SUDataManager createChildContext]'는 * workQueue의 시작 부분에 있어야하며, 그 중 하나는 NSOperation이 아니어야합니다. – SwiftArchitect

+0

글쎄, 실제로는 메인 스레드 (NSPrivateQueueConcurrencyType)에서 직접 메시지를 보낼 수 있습니다. 'NSOperation'과 관련해서는 문서의이 섹션이'NSPrivateQueueConcurrencyType'이 아닌'NSConfinementConcurrencyType'에 대해 말하는 것으로 보입니다. 어쨌든 그것은 불분명하다. – Xyand