2014-01-13 49 views
0

我會永遠有這個問題,因爲我決定像獲取的所有後臺數據的findAll這coredata + MagicRecords,如何在後臺

dispatch_async(queue, ^{ 

    /* fetch my data here */ 
    self.data = [SomeEntity MR_findAll]; 

    dispatch_sync(dispatch_get_main_queue(), ^{ 
     [self.tableview reloadData]; 

    }); 
}); 

它正常工作時先開始,如果你去到另一種觀點認爲控制器和等待分鐘夫婦然後再回來,所有實體發現變成故障狀態並沒有更多的屬性都可以訪問

我是第一次使用GCD背景隊列

,然後我試圖創建自己的隊列

queue = dispatch_queue_create("com.myname.queue", DISPATCH_QUEUE_CONCURRENT); 

它仍然故障的一切

我看着MagicRecords'來源似乎它會自動對當前線程

我運行的想法創造新環境,請大家幫忙

THX提前

回答

0

解決這個問題的一個好主意是免除第三方框架的不可預測和難以追查的行爲。你可以通過默認的標準管理對象API來繞過這個。

看起來,MR在表格視圖中表現不佳。數據太多,核心數據錯誤的對象。相反,實現普通香草NSFetchedResultsController並享受其免費內存優化,包括自動錯誤和未按需要管理的對象。

0

你不能。 MR正在按照設計工作。

與所有UIKit UI元素一樣,tableview UI在主線程中工作。

您不可以與Core-Data交叉線程,這意味着NSManagedObjects及其關聯的上下文屬於創建它們的線程。任何與Core Data交叉線程的嘗試最終都會崩潰。

因此,您可以在覈心數據中進行後臺處理,並將其合併到主線程上下文中,但是需要在主線程的用戶界面中獲取您要呈現的數據。

這樣你就可以做到這一點...

dispatch_async(queue, ^{ 

    [self doSomeHeavyProcessingForSomeEntityThenSaveThreadContext]; 

    dispatch_sync(dispatch_get_main_queue(), ^{ 
     self.data = [SomeEntity MR_findAll]; 
     [self.tableview reloadData]; 

    }); 
});