0

CoreData에 보관중인 값이있는 사전 구성 파일 (많은 매개 변수가 있음)이 있습니다. 내가 동시성 (CoreData에 이전 저장) 각 값을 처리하고 1 대 모든 entityName1과의 관계와 CoreData (entityName2에 저장하려면 다음핵심 데이터 동시성 : 주 스레드와 별개로 두 개의 큰 연속 작업 (큰 작업 중 하나에서 많은 동시 작업이 필요함)

Create new instance of NSManagedObjectContext: NSManagedObjectContextVariable. 
[parametersInFileArray enumerateObjectsWithOptions:NSEnumerationConcurrent 
             usingBlock:^(id obj, NSUInteger idx, BOOL *stop){ 
    [NSManagedObjectContextVariable performBlock:^{ 
     bla-bla-bla 
     insertNewObjectForEntityForName:entityName1 inManagedObjectContext:NSManagedObjectContextVariable; 
     [NSManagedObjectContextVariable save:&error]; 
    } 

}

: 의이 호출 첫 번째 작업을하자). 두 번째 작업이라고합시다.

1.Create new instance of NSManagedObjectContext. 
2.Get (NSArray *)fetchedObjects form entity("entityName1") 
3. 
[fetchedObjects enumerateObjectsUsingBlock:^(entityName1Class *obj, NSUInteger idx, BOOL *stop){ 
     NSArray* newParameters = getManyNewParametersForObj(obj); 
     [newParameters enumerateObjectsUsingBlock:^(Parameter *param, NSUInteger idx, BOOL *stop) 
    { 
     bla-bla-bla 
     insertNewObjectForEntityForName:entityName2 inManagedObjectContext:NSManagedObjectContextVariable; 
     [NSManagedObjectContextVariable save:&error]; 
    } 

} 

So. 작업 1과 작업 2를 서로 연속적으로 실행해야합니다. 그리고 메인 스레드와 분리해라. 두 번째 작업은 첫 번째 작업이 완료 될 때까지 시작할 수 없습니다.

는 작업 2에서 나는 + insertNewObjectForEntityForName + 것은 fetchedObjects OBJ() 동시성에서 각 요소에 대해을 저장 getManyNewParametersForObj를 시작해야합니다. 긴 작업 (Net에서 매개 변수 가져 오기)이며 서로 의존하지 않습니다.

작업 1과 작업 2의 모든 저장시에 NSTableView (Observe NSManagedObjectContextDidSaveNotification)를 업데이트합니다.

나는 매우 dispatch_apply에 의해 혼란 스러워요, performBlock, enumerateObjectsUsingBlock, enumerateObjectsUsingBlock, enumerateObjectsWithOptions : parallelQueue 등 NSEnumerationConcurrent, semaphoreWait, semaphoreBlock, blockUntilWait, serialQueue,

어떻게 무엇을해야하는 나에게 조언. 감사합니다. .

답변

0

MagicalRecordSMC을 보셨습니까?

MagicalRecord은 컨텍스트 생성, 블록 (다른 스레드) 저장 및 상위 컨텍스트로 다시 병합 할 수 있습니다.

따라서 컨텍스트와 스레드를 설정하려면 다음과 같이하십시오.

[MagicalRecord saveWithBlock:^(NSManagedObjectContext *localContext)

블록은 자신의 컨텍스트를 사용하여 자체 스레드를 실행할 것이다. 또한 메인 스레드에서 수행 할 완료 블록을 정의 할 수 있습니다. 이렇게하면 백그라운드 스레드와 기본 스레드 사이에 피드백이 있습니다. 그리고 세마포어에 들어가는 것을 피하십시오.

SMC은 Objective C 및 다른 언어 용 Finite State Machine 컴파일러입니다. 구문과 FSM 구현 방법을 이해하는 데는 약간의 시간이 걸릴 수 있지만 앞선 노력의 가치가 있습니다. 구현 된 유지 보수 및 변경 작업은 매우 쉬워 질 것입니다. Eitan Suez은 훌륭한 자습서 PDF를 제작했습니다.

SMC를 사용하면 각 작업에 대해 state을 정의 할 수 있습니다. 각 주에는 entry action이 있습니다. entry action은 질문에 표시되는 코드가 포함 된 메소드입니다.

State 1 끝이나 Task 1으로 전화를 걸면 transition을 다음 상태로 시작합니다.FSM이 전환되어 다음에 정의 된 상태의 입력 작업을 수행합니다 (Task 2). 이렇게하면 Task 1Task 2 전에 수행됩니다.

FSM은 병렬 작업을 즉시 지원하지 않습니다. 수퍼 작업 2의 하위 작업을 병렬로 실행하려면 각 하위 작업의 완료를 모니터링해야합니다. 나는 3 개의 카운터로 이것을한다. 하위 작업이 문제가 발생했습니다 때 하위 작업이 에러없이

  • failedTasks 단위가 완료되면
    • totalTasks

      그것은 하위의 전체 수는
    • goodTasks 증가를 시작했다.

    이제 goodTasks + failedTasks == totalTasks이되면 supertask 2의 모든 하위 작업이 완료되었습니다. failedTasks == 0이면 모든 것이 잘 진행되었습니다. failedTask은 FSM이 오류 처리 상태로 전환하도록 할 수 있습니다.

    다른 Finite State Machine 구현이 있지만 SMC가 실제로 유연하다는 것을 알았습니다.