我在使用NSFetchedResultsController
和sortDescriptors
來請求填充表中有很多結果的表。我注意到,如果發生的變化將表格底部附近的一行移動到頂部,則didChangeObject:atIndexPath:forChangeType:newIndexPath:
根本不會被調用。NSFetchedResultsController並不總是調用didChangeObject:atIndexPath:forChangeType:newIndexPath:NSFetchedResultsChangeMove
奇怪的是,我可以通過所有獲取的對象迭代,並調用performFetch
後立即訪問他們的任何屬性解決這個問題。
什麼的問題可能是,或者這只是一個不起眼的蘋果的bug任何提示嗎?
這裏是我的代碼:
NSManagedObjectContext *context = [self managedObjectContext];
NSFetchRequest *request = [[NSFetchRequest alloc] init];
request.entity = [NSEntityDescription entityForName:@"MyObject" inManagedObjectContext:context];
request.sortDescriptors = @[NSSortDescriptor sortDescriptorWithKey:@"order" ascending:NO]];
request.fetchBatchSize = 20;
NSFetchedResultsController *fetched = [[NSFetchedResultsController alloc]
initWithFetchRequest:request
managedObjectContext:context
sectionNameKeyPath:nil
cacheName:nil];
fetched.delegate = self;
NSError *error = nil;
if (![fetched performFetch:&error]) {
NSLog(@"Unresolved error fetching objects: %@", error);
}
// Should not be necessary, but objects near the bottom won't move to the top without it.
for (MyObject *o in fetched.fetchedObjects) {
o.someAttribute;
}
更新2014年9月12日:
我節省在後臺管理對象範圍內的所有數據,並且它似乎與我的問題看到。這是我的代碼,用於合併主要對象上下文中的更改:
+(void)initSaveListener {
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(mergeChanges:)
name:NSManagedObjectContextDidSaveNotification
object:[self privateContext]];
}
+(void)mergeChanges:(NSNotification*)notification {
NSManagedObjectContext *context = [self mainContext];
[context performBlock:^{
[context mergeChangesFromContextDidSaveNotification:notification];
NSError *error = nil;
if (![context save:&error]) {
NSLog(@"error merging changes %@, %@", error, [error userInfo]);
}
}];
}
是什麼導致此舉?根據您的描述,聽起來好像表格視圖中發生了變化(即用戶正在移動一行) – quellish 2014-08-31 06:00:40
用戶操作不會導致它移動。這個變化發生在服務器上,並被流式傳輸到客戶端,並在核心數據中更新。這部分工作正常,並且在表視圖上調用reloadData會顯示正確的順序。 – ninjudd 2014-09-08 17:02:57
是核心數據變化發生在'[self managedObjectContext]',父上下文還是子上下文描述的上下文中? – quellish 2014-09-08 18:28:09