2014-04-11 104 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

您是否閱讀過關於此主題的Apple文檔,前幾天我發佈了關於您的非常類似的問題? – Koen

+0

魔法記錄是第三方庫,不包含在Apple的文檔中。 – soleil

+1

你不必一切都用MR。從Apple閱讀文檔以更好地理解您的問題並不會造成任何傷害。 – 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的原始代碼段具有相同的行爲。 –

+0

好 - 我在調用上下文的'-performBlock:'時調用了find,這會導致後續的'-performBlockAndWait:'等待上下文的隊列,而不是主隊列。 –