【发布时间】:2015-07-21 17:44:43
【问题描述】:
我正在使用viewDidLoad 中的以下获取请求创建一个NSFetchedResultsController
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] initWithEntityName:NSStringFromClass([Person class])];
fetchRequest.sortDescriptors = @[[NSSortDescriptor sortDescriptorWithKey:NSStringFromSelector(@selector(sortDate))
ascending:NO]];
NSFetchedResultsController *controller = [[NSFetchedResultsController alloc] initWithFetchRequest:request
managedObjectContext:self.mainManagedObjectContext
sectionNameKeyPath:nil
cacheName:nil];
controller.delegate = delegate;
NSError *error;
if (![controller performFetch:&error]) {
NSLogError(error);
}
// Connecting up all the delegates for UITableView
然后用[self.tableView reloadData]重新加载viewWillAppear
一个简化的Person
@interface Person : NSManagedObject
/// an NSTimeInterval representing the Unix Epoch
@property (nonatomic, retain) NSNumber *sortDate;
- (void)viewed;
@end
@implementation Person
// nothing fancy or custom - no extra KVO or primitive assignments
@dynamic sortDate;
- (void)viewed {
self.sortDate = @([NSDate date].timeIntervalSince1970);
}
@end
我的数据是通过网络请求生成的,用于获取一堆 json 并将其转换为NSManagedObjects。排序看起来不错。
1 Person A time 1437498898
2 Person B time 1437498897
3 Person C time 1437498896
当我使用-viewed 方法调整Person C 上的sortDate 属性时,在<NSFetchedResultsControllerDelegate> 中,我得到NSFetchedResultsChangeMove 的更改类型,并且列表的排序如下:
1 Person C time 1437498900
2 Person A time 1437498898
3 Person B time 1437498897
当我尝试对Person B 执行相同操作时,我得到了NSFetchedResultsChangeUpdate 的更改类型,并且列表的排序如下:
1 Person C time 1437498900
2 Person A time 1437498898
3 Person B time 1437498905
我可以不断更新 sortDate 的人员 A 和 C,他们将继续正确排序。 Person B 的任何更改直到应用程序重新启动后才会显示,但随后 Person B 停止更新。删除并重新安装我的应用程序(以清除 CoreData)没有帮助。
如果我在- (void)controller:(NSFetchedResultsController *)controller didChangeObject:(id)anObject atIndexPath:(NSIndexPath *)indexPath forChangeType:(NSFetchedResultsChangeType)type newIndexPath:(NSIndexPath *)newIndexPath 中放置print 命令,那么我可以看到Person B 的sortDate 确实已更新为新值,这应该导致 NSFRC创建 Move 事件而不是 Update 更改类型。
// Original Sort (logs from cellForRowAtIndexPath)
Time 1437506506 - Person B
Time 1437506490 - Person C
Time 1437506381 - Person D
Time 1437506128 - Person A
// Change Person A
Updating SortDate 1437506128 --> 1437506599
Time 1437506599 - Person A for NSFetchedResultsChangeMove
// Sorted Correctly
Time 1437506599 - Person A
Time 1437506506 - Person B
Time 1437506490 - Person C
Time 1437506381 - Person D
// Change Person B
Updating SortDate 1437506506 --> 1437506610
Time 1437506610 - Person B for NSFetchedResultsChangeUpdate
// Sorted Incorrectly
Time 1437506599 - Person A
Time 1437506610 - Person B
Time 1437506490 - Person C
Time 1437506381 - Person D
那么,为什么NSFetchedResultsController 返回错误的NSFetchedResultsChangeType?
【问题讨论】:
标签: objective-c core-data nsfetchedresultscontroller