2011-09-27 154 views
0

我已經安裝一些方法在後臺加載核心數據使用NSOperationQueue,像下面:核心數據加載

operation = [[NSInvocationOperation alloc] initWithTarget:self              
selector:@selector(selectToLoadDataOne) object:nil]; 

operation = [[NSInvocationOperation alloc] initWithTarget:self              
selector:@selector(selectToLoadDataTwo) object:nil]; 

的「selectToLoadDataOne」和「selectToLoadDataTwo」只是使用模板標準NSFetchRequest來自應用程序委託的NSManagedContext。 問題是加載了幾次之後,它只是完全停止加載並卡住executeFetchRequest:並且沒有任何錯誤。

我知道這與線程與核心數據的使用有關,所以我嘗試爲每個調用創建一個新的nsmanagedobjectcontext,但返回的結果爲空nsmanagedobject。

有人可以指向我可以用來解決從後臺線程加載核心數據的一個很好的示例或文檔嗎?

回答

1

核心數據有有關在多個線程上運行的特定規則。每個線程必須有一個NSManagedObjectContext,並且NSManagedObjectContext將用於的線程必須是創建它的線程。

您遇到問題是因爲您違反了該規則。

而不是使用一個NSInvocationOperation的:

  1. 創建NSOperation
  2. 通在NSPersistentStoreCoordinator
  3. 子類創建的 - 主

當然的NSManagedObjectContext這隻會將它們加載到NSPersistentStoreCoordinator中,並且您仍然需要在主要的中重新加載它們。

爲什麼需要在後臺線程上加載數據?想要加快數據加載速度通常表示應用程序存在更深層次的問題。

+0

缺乏經驗,需要在數據加載時顯示轉輪。 :-) –

+0

從sqlite加載數據應該非常快。如果不是,那麼我建議你看看這個問題。在後臺線程中加載它並不會解決你的問題,至少不是沒有很多痛苦。優化數據加載;調試SQL,看看爲什麼它很慢,並解決了核心問題。 –