2012-02-27 87 views
0

我完全新的核心數據和我想知道下面的任務,我想要做的(即使我應該使用核心數據的話)的最佳方法:另一個多線程核心數據使用

  • 我有幾個不同的1對1和1對多關係的實體。

  • 我想顯示「合併」的信息給用戶在表視圖

  • 組要獲得「合併」的信息,我需要做的不是簡單地抓取了一些行等等。我需要得到一些實體,根據一些算法進行篩選,確定某些信息(存儲在瞬態性能)等

  • 一旦有了結果(一組實例的降低)我要展示給用戶

  • 因爲它是一個沉重的任務,我想在一個分離的後臺線程來執行它


說,當我有一組選擇ManagedObject的準備:

  • 我是否應該僅將其「ID」傳遞給主線程以便在主ManagedContext中重新獲取它們?我可以怎樣處理計算出來的瞬態信息(要在表格單元格中顯示其他數據)。

  • 難道我不能只是將它們傳回才顯示?

  • 對於最後一個問題,我可以「鎖定」ManagedContext以確保數據傳遞沒有任何問題(我讀過這可能是一個選項)?

  • 核心數據是否適用於此用途?我應該考慮另一種方法/技術嗎?


預先感謝

回答

1
  • 我應該通過不僅僅是他們的「標識」主線程才能重新獲取 他們在主ManagedContext?我可以怎樣處理計算得到的瞬態 信息(要在表格的 單元中顯示其他數據)。
  • 難道我不能把它們傳回來顯示嗎?

沒有必要經過IDS的,你可以很容易地調用的NSOperation做你的計算和檢索和存儲你的對象的集合,然後在計算結束時,您只需要撥打:

[tableView performSelectorOnMainThread:@selector(reloadData) withObject:nil waitUntilDone:YES]; 

這將觸發表再次調用其委託選擇器。最重要的是,你必須檢索到的對象存儲在數據源到委託選擇訪問,這可能是例如一個的NSArray:

@property(nonatomic,strong) NSArray *datasource; 

-(void)loadDataAsynchronously { 

    NSOperationQueue *queue = [NSOperationQueue new]; 
    NSInvocationOperation *operation = [[NSInvocationOperation alloc] initWithTarget:self 
                      selector:@selector(loadData) 
                       object:nil]; 

    [queue addOperation:operation]; 
} 

-(void)loadData{ 
    // do your calculation and store into array 
    self.datasource=...... 

    // reload on main thread 
    [tableView performSelectorOnMainThread:@selector(reloadData) withObject:nil waitUntilDone:YES]; 
} 

- (UITableViewCell *)tableView:(UITableView *)table cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
    YourObject *obj = [[self datasource] objectAtIndex:indexPath.row]; 
    YourTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"tableCell"]; 
    cell.cellTitle.text=obj.titleForCell; 
    cell.cellDescr.text=obj.descriptionForCell; 
    return cell; 
} 
  • 對於最後一個問題,我可以「鎖定」 ManagedContext確保數據通過沒有任何問題(我讀過這可能是一個選項)?

一旦檢索到對象,如果您只有一張表,就不需要鎖定CoreData。否則,如果你意識到後臺線程可能會改變你已經顯示的數據,並且你的表格可以被編輯和保存,你必須設置一個重要的邏輯來處理這個問題。否則你會得到一個「不一致性錯誤」。但是如果你有一個只讀表,例如你可以提醒控制器是否有人更改了數據,並要求他們重新加載表。

  • 是核心數據佔用這個用法?我應該考慮另一種方法/技術嗎?

是的,你應該注意的唯一一點是你在做什麼樣的計算。最常見的錯誤是將CoreData視爲SQL數據庫而不是對象圖(我經常犯的錯誤),因此很多粒子和準確的類似於SQL的操作是不可能的。在許多情況下,您將結束檢索基於標準的集合,您必須在內存計算中進一步做更多工作。但說實話,儘管有許多人說,除非你有一千條記錄,否則我發現所有的iOS設備對於合理的數據量都非常快。

+0

感謝您的回答。
我問了第一個問題,因爲它總是說「永遠不要跨越線程邊界」。
我來自Java編程,並且存在「不是線程安全」,它與「不要在線程之間傳遞」不一樣。你只需要知道你在做什麼,並明智地使用「同步」。但是,一些信息可能會綁定到線程,這可能是原因。
我的代碼其實和你的代碼非常相似。 – JZarzuela 2012-03-01 19:34:02