我在Objective-C中有以下問題。當我從我的ManagedObjectContext中刪除一個對象並保存了這個改變時,我如何通知我的fetchedResultsController執行新的提取?根據我的理解,發送performFetch-Message方法是不正確的。如何通知NSFetchedResultsController關於[NSManagedObjectContext保存]
謝謝!
我在Objective-C中有以下問題。當我從我的ManagedObjectContext中刪除一個對象並保存了這個改變時,我如何通知我的fetchedResultsController執行新的提取?根據我的理解,發送performFetch-Message方法是不正確的。如何通知NSFetchedResultsController關於[NSManagedObjectContext保存]
謝謝!
您可以使用postNotificaton
爲此,您應該已經在控制器中設置了一個觀察器,該觀察器將再次啓動提取請求。使用該委託方法
你可以把它更多鈔票
fetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:[self managedObjectContext] sectionNameKeyPath:nil cacheName:nil];
,並設置參數cacheName到零值。它避免了崩潰和ManagedObjectContext變更後只保留最新數據
#pragma mark -
#pragma mark Fetched results controller delegate
- (void)controllerWillChangeContent:(NSFetchedResultsController *)controller {
[self.tableView beginUpdates];
}
- (void)controller:(NSFetchedResultsController *)controller didChangeSection:(id <NSFetchedResultsSectionInfo>)sectionInfo
atIndex:(NSUInteger)sectionIndex forChangeType:(NSFetchedResultsChangeType)type {
switch(type) {
case NSFetchedResultsChangeInsert:
[self.tableView insertSections:[NSIndexSet indexSetWithIndex:sectionIndex] withRowAnimation:UITableViewRowAnimationFade];
break;
case NSFetchedResultsChangeDelete:
[self.tableView deleteSections:[NSIndexSet indexSetWithIndex:sectionIndex] withRowAnimation:UITableViewRowAnimationFade];
break;
}
}
- (void)controller:(NSFetchedResultsController *)controller didChangeObject:(id)anObject
atIndexPath:(NSIndexPath *)indexPath forChangeType:(NSFetchedResultsChangeType)type
newIndexPath:(NSIndexPath *)newIndexPath {
UITableView *tableViews = self.tableView;
switch(type) {
case NSFetchedResultsChangeInsert:
[tableViews insertRowsAtIndexPaths:[NSArray arrayWithObject:newIndexPath] withRowAnimation:UITableViewRowAnimationFade];
break;
case NSFetchedResultsChangeDelete:
[tableViews deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
break;
case NSFetchedResultsChangeUpdate:
[_delegate configureCell:[tableViews cellForRowAtIndexPath:indexPath] atIndexPath:indexPath];
break;
case NSFetchedResultsChangeMove:
[tableViews deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
[tableViews insertRowsAtIndexPaths:[NSArray arrayWithObject:newIndexPath]withRowAnimation:UITableViewRowAnimationFade];
break;
}
}
- (void)controllerDidChangeContent:(NSFetchedResultsController *)controller {
[self.tableView endUpdates];
NSIndexPath *indexPath = [NSIndexPath indexPathForRow:0 inSection:0];
[self.tableView scrollToRowAtIndexPath:indexPath
atScrollPosition:UITableViewScrollPositionMiddle
animated:NO];
}
這段代碼自動更新並重新加載當您添加,刪除或更新NSFetchedResultsController和的UITableViewController
只要更改次數很少就可以使用。如果你得到一個大的批量更新,那麼這將會嚴重滯後UI線程...... – jjxtra 2012-02-25 15:40:16
即使只是1,我也遇到了麻煩。但它不是滯後。 – 2012-03-19 05:04:41
postNotification的數據? – 2012-03-19 05:10:02