- 我應該通過不僅僅是他們的「標識」主線程才能重新獲取 他們在主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設備對於合理的數據量都非常快。
感謝您的回答。
我問了第一個問題,因爲它總是說「永遠不要跨越線程邊界」。
我來自Java編程,並且存在「不是線程安全」,它與「不要在線程之間傳遞」不一樣。你只需要知道你在做什麼,並明智地使用「同步」。但是,一些信息可能會綁定到線程,這可能是原因。
我的代碼其實和你的代碼非常相似。 – JZarzuela 2012-03-01 19:34:02