0

내 iPhone 앱에서 핵심 데이터를 통해 로그인 한 후 많은 데이터를 삽입하고 있습니다. 처음에는 데이터가 삽입되는 동안 로더가 표시되어 UI 차단이 문제가 아니었지만 이제는 로더를 제거하고 managedobjectcontext 동시성 유형을 NSPrivateQueueConcurrencyType으로 변경하여 백그라운드 스레드의 모든 삽입 작업을 이동했습니다. 무거운 삽입 작업에서 UI를.모든 핵심 데이터 작업에 privatecontext를 사용하지 않는 이유는 무엇입니까?

모든 작업에 대해이 동일한 컨텍스트를 사용하고 아니며 NSMainQueueConcurrencyType을 사용하지 않으면 어떤 단점이 있을지 궁금합니다. 권장 사항입니까?

답변

1

에 대해 NSPrivateQueueConcurrencyType을 사용하고 모든 컨텍스트의을 사용해야합니다. 예를 들어, NSFetchedResultsController은 큐 제한을 사용하기위한 모든 규칙 (즉, 페치는 큐를 통해 수행되어야하며 결함 등)을 준수하는 한 개인 큐 컨텍스트에서 올바르게 작동합니다. There is a bug with NSFetchedResultsController caching when using private queue contexts이지만 캐싱은 제한된 수의 사용 사례 만 포함합니다.

코어 데이터의 데이터를 사용하여 UI 요소를 업데이트하는 경우에도 여전히 기본 대기열에서 UI에 액세스해야합니다.

[[object managedObjectContext] performBlock:^{ 
    NSString *text = [object someProperty]; 
    [NSOperationQueue mainQueue] addOperationWithBlock:^{ 
     [[self someLabel] setText:text]; 
    }]; 
}]; 

이 개인 큐의 감금을 사용하는 많은 장점이 있습니다 : 예를 들어,이 라벨을 업데이트 할 속성에 액세스 할 수있다. 단점은 위의 코드를 포함해야한다는 것입니다. 메인 큐에서 핵심 데이터 작업을 수행하는 것보다 훨씬 중요한 코드입니다.

0

핵심 데이터를 포함하는 모든 작업이이 컨텍스트에서 수행되는 한 단점은 없습니다.

아마도 차이점은 있지만 실제로는 단점이라면 모든 데이터 작업을 비동기 적으로 수행해야한다는 것입니다.

그런데 핵심 데이터에는 자체 "백그라운드"스레드가 있으며 "performBlock"을 사용하여 모든 작업을 수행하면 정상이됩니다. 당신이 우리를 말해야한다

What is NSManagedObjectContext's performBlock: used for?

+0

UI 요소를 터치하면 단점이 있습니다. –

0

진짜 세부 실행중인 작업의 유형입니다.

UI를 건드리지 않으면 다른 스레드에서 작업을 수행하는 것이 좋습니다. 예를 들어 백엔드에서 JSON 데이터 (많은 데이터)를 가져오고 있다고 가정 해 보겠습니다. 그것 없이는 앱이 멈출 수 있습니다.

NSMainQueueConcurrencyType은 기본 발송 대기열 및 주 스레드와 연결된 컨텍스트를 만듭니다. 이러한 컨텍스트를 사용하여 주 스레드, 일반적으로 UI 요소에서 실행해야하는 개체에 연결할 수 있습니다. 따라서 예를 들어 NSFetchedResultsController을 처리 할 때 필요합니다.

어쨌든 병목 현상을 발견하는 동안 내 개인적인 조언은 응용 프로그램을 프로파일하고 스레드 컨텍스트를 사용하는 것입니다. 핵심 데이터는 상당히 복잡해질 수 있습니다. 가능한 한 간단하게 머물러있게하십시오.

+0

떨어져 json 데이터를 가져 오는 것 또한 목록 및보기 (기본 컨텍스트에서 이동할 수)에서 핵심 데이터를 가져 오는 일반 레코드를 사용하는 것을 의미합니다 – Firdous

0

내가 단점이라면 NSManagedObjects을 사용할 수 없다는 것입니다. -performBlock: 외부에서 걸릴 수 있습니다. -performBlock: 내부에서 직접 UI를 터치 할 수 없으므로 값을 UI 요소로 전달하려면 블록 밖으로 개별 속성을 전송해야합니다.

또한 NSMainQueueConcurrencyType의 컨텍스트에는 백그라운드 큐가 없습니다. -performBlock:이 수행하는 작업은 실행 루프주기에서 블록을 대기열에 넣는 것입니다. 따라서 코드의 실행이 명령문에서 계속되는 것처럼 보이지만 블록이 실행되면 나중에 스레드를 차단합니다.

+0

"나는 당신이 안쪽, 바깥에서 잡아 NSManagedObjects 사용할 수 있습니다 -performBlock : "을 참조하십시오. 이는 대기열 제한을 사용하는 모든 컨텍스트, 개인 대기열 또는 기본 대기열에 해당합니다. – quellish

+0

@quellish 물론 ​​있습니다. 그러나 모델과 UI 요소 간의 정보 흐름을 중재하기 위해 뷰 컨트롤러 코드에서 관리 대상 개체에 대한 액세스 권한을 유지하는 것이 일반적입니다. 기본 대기열 유형의 컨텍스트를 사용하면 개인 대기열을 사용하는 동안 쉽게 이동할 수 있습니다. – svena

+0

NSMainQueueConcurrencyType 컨텍스트를 사용하고 있다면'performBlock :'과'performBlockAndWait :'를 통해 여전히 컨텍스트에 액세스해야합니다. 이렇게하지 않으면 사용자 이벤트의 일관성없는 처리와 같이 응용 프로그램에 미묘한 버그가 생길 수 있습니다. – quellish