2014-04-11 1 views
0

는 다음과 같이 MR과 함께 간단한 페치를 수행 :메인 스레드를 차단하지 않는 MR_findFirstWithPredicate 대신 사용할 수 있습니까?

Cat* cat = [Cat MR_findFirstWithPredicate:predicate]; 

시간 프로파일 내 응용 프로그램에서 가장 많은 시간 빨아 먹는 과정의 하나로서이하지 않다고 생각한다. 그리고 사실 MR_findFirstWithPredicate에 대한 스택 추적이 리드 :

+ (NSArray *) MR_executeFetchRequest:(NSFetchRequest *)request inContext:(NSManagedObjectContext *)context 
{ 
    __block NSArray *results = nil; 
    [context performBlockAndWait:^{ 

     NSError *error = nil; 

     results = [context executeFetchRequest:request error:&error]; 

     if (results == nil) 
     { 
      [MagicalRecord handleErrors:error]; 
     } 

    }]; 
    return results; 
} 

주 문제의 근본이다 "performBlockAndWait을". 그래서 대체 무엇입니까? 백그라운드에서 페치를 수행하려면 어떻게해야합니까? 메인 스레드를 방지 할 수 있습니다 비 주 스레드에서 관리되는 개체 컨텍스트에서 찾기를 수행

+1

내가 당신에게서 매우 비슷한 질문에 몇 일 전에 게시 된이 주제에 애플의 문서를 읽습니까? – Koen

+0

Magical Record는 타사 라이브러리이므로 Apple의 문서에서 다루지 않습니다. – soleil

+1

MR을 가지고 모든 것을 할 필요는 없습니다. 그리고 문제를 더 잘 이해하기 위해 애플의 문서를 읽는 것이 상처를주지 않을 것이다. – Koen

답변

3

차단 :

위의 공원에 의해 제안
NSManagedObjectContext *backgroundContext = [NSManagedObjectContext MR_context]; 
[backgroundContext performBlock:^{ 
    Cat* cat = [Cat MR_findFirstWithPredicate:predicate inContext:backgroundContext]; 
}]; 

는, 이것은 MagicalRecord의 개념이 아니다 - 그것은 중요한 부분입니다 핵심 데이터. MagicalRecord가 Core Data의 일부를 좀 더 간단하게 만들 수 있지만, Core Data가 어떻게/왜 왜 잘 작동 하는지를 이해하는 데 큰 도움이됩니다.

+0

그 메소드는 또한'performBlockAndWait :'를 호출하는 것처럼 보입니다, 그래서 그것은 asker의 원래 스 니펫과 같은 행동이라고 생각합니다. '이후'-performBlockAndWait 일으킬해야합니다 : '컨텍스트의 큐가 아닌 메인 큐에 대기 할 - –

+0

좋은 캐치 나는 문맥의'-performBlock에 대한 호출에서 찾기를 포장했습니다. –