2013-09-01 38 views
1

我使用MagicalRecord lib加載一些用於填充tableview的CoreData對象。這是一個緩慢的操作,因此我試圖在背景威脅上做到這一點。 這一切看起來都很順利,數據被加載到self.products,只有經過一段時間(+ - 分鐘)後,所有加載的對象纔會進入<fault>狀態。我不明白爲什麼會發生這種情況,任何人都有想法?Coredata magicalrecord在後臺獲取對象進入<fault>狀態

- (void)doInBackground 
{ 
dispatch_queue_t myQueue = dispatch_queue_create("com.mycompany.myqueue", 0); 
    dispatch_async(myQueue, ^{ 
     [self reloadData]; 

     dispatch_sync(dispatch_get_main_queue(), ^{ 

      [MBProgressHUD hideHUDForView:self.view animated:YES]; 
      [self performSelectorOnMainThread: @selector(sortData:) withObject:self waitUntilDone:YES]; 

     }); 
    }); 
} 

- (void)reloadData 
{ 
NSArray *allProducts = [NSArray array];  
allProducts = [NSArray arrayWithArray:[Product MR_findAll]]; 
self.products = [NSArray arrayWithArray:allProducts]; 
} 

回答

3

首先,通過僅使用MR_findAll而不指定上下文,隱式使用默認上下文。這最終會導致崩潰或其他未知行爲。其次,你不需要所有的NSArrays。 MR_findAll(和所有其他MR_find *方法)的返回值返回結果數組。無需將內容從陣列移動到陣列...

最後,您的問題。因爲您正在主上下文隊列上執行提取操作,所以提取操作將會阻止用戶界面。你需要做一個專用隊列的上下文,並執行你的讀取,像這樣:

NSManagedObjectContext *privateQueueContext = [NSManagedObjectContext MR_privateQueueContext]; 
NSArray *results = [Product MR_findAllInContext:privateQueueContext]; 

此外,您可能想看看你的分批取。請看有關獲取像這樣爲獲取請求的文檔:

NSFetchRequest *request = [Product MR_requestAllInContext:privateQueueContext]; 
//update batch size here 

MagicalRecord擁有一批規模內部設置,但如果你需要去改變它,這是你去這樣做的方式。

+0

對不起,但這有點令人困惑,MR_privateQueueContext不被MagicalRecord識別。你可以重寫我的代碼,以解決問題的地方獲取對象進入狀態? – Oysio

+0

MR_privateQueueContext位於features/experimental分支上。嘗試切換到現在,而我理清了一些實驗功能回到開發/主要主線的細節。 – casademora

+0

@casademora我有緩慢的提取導致UI阻塞相同的問題。 MR_privateQueueContext沒有已知的類方法。我知道你建議切換到實驗分支,但我想知道是否有一個可靠的方法來處理這個問題? – soleil

相關問題