SNRFetchedResultsController
是从 iOS 到 OS X 的 NSFetchedResultsController
的“移植” (NSFetchedResultsController
的一个“移植”,而不是直接替代品)。它不是 NSFetchedResultsController
的直接替代品,但它执行了许多相同的任务,与管理和通知代理对象插入、删除、更新或移动有关以更新 UI。
该项目处于早期阶段,可能存在一些(很多)错误。任何反馈、错误报告和代码贡献都将深受欢迎。
SNRFetchedResultsController
不支持分区或缓存,主要是因为(与 UITableView
不同)NSTableView
不支持分区。尽管如此,SNRFetchedResultsController
可以与支持分区的自定义 UI 控件一起使用,所以这将是未来要添加的不错功能。SNRFetchedResultsController
使用索引 (NSUInteger
) 而不是 NSIndexPath
该项目假设代码将在 ARC 环境下编译。这意味着没有内存管理代码存在,因此如果您打算在非 ARC 项目中使用此类,则必须手动插入正确的引用/释放调用,或者您必须使用带有 -fobjc-arc
标志编译 SNRFetchedResultsController.m
。
NSFetchRequest *request = [[NSFetchRequest alloc] init];
request.entity = [NSEntityDescription entityForName:@"Car" inManagedObjectContext:context];
request.sortDescriptors = [NSArray arrayWithObjects:[NSSortDescriptor sortDescriptorWithKey:@"year" ascending:YES], nil];
request.predicate = [NSPredicate predicateWithFormat:@"wheels.@count != 0"];
request.fetchBatchSize = 20;
self.fetchedResultsController = [[SNRFetchedResultsController alloc] initWithManagedObjectContext:context fetchRequest:request];
self.fetchedResultsController.delegate = self;
NSError *error = nil;
[self.fetchedResultsController performFetch:&error];
if (error) {
NSLog(@"Unresolved error: %@ %@", error, [error userInfo]);
}
- (NSInteger)numberOfRowsInTableView:(NSTableView *)aTableView
{
return [self.fetchedResultsController count];
}
- (id)tableView:(NSTableView *)aTableView objectValueForTableColumn:(NSTableColumn *)aTableColumn row:(NSInteger)rowIndex
{
return [self.fetchedResultsController objectAtIndex:rowIndex];
}
- (void)controller:(SNRFetchedResultsController *)controller didChangeObject:(id)anObject atIndex:(NSUInteger)index forChangeType:(SNRFetchedResultsChangeType)type newIndex:(NSUInteger)newIndex
{
switch (type) {
case SNRFetchedResultsChangeDelete:
[self.tableView removeRowsAtIndexes:[NSIndexSet indexSetWithIndex:index] withAnimation:NSTableViewAnimationSlideLeft];
break;
case SNRFetchedResultsChangeInsert:
[self.tableView insertRowsAtIndexes:[NSIndexSet indexSetWithIndex:newIndex] withAnimation:NSTableViewAnimationSlideDown];
break;
case SNRFetchedResultsChangeUpdate:
[self.tableView reloadDataForRowIndexes:[NSIndexSet indexSetWithIndex:index] columnIndexes:[NSIndexSet indexSetWithIndex:0]];
break;
case SNRFetchedResultsChangeMove:
[self.tableView removeRowsAtIndexes:[NSIndexSet indexSetWithIndex:index] withAnimation:NSTableViewAnimationSlideLeft];
[self.tableView insertRowsAtIndexes:[NSIndexSet indexSetWithIndex:newIndex] withAnimation:NSTableViewAnimationSlideDown];
break;
default:
break;
}
}
我是Indragie Karunaratne,来自加拿大艾伯塔省爱民顿的17岁Mac OS X和iOS开发者。访问我的网站查看我的作品,或与我联系。(在Twitter上关注我!)
SNRFetchedResultsController
采用了BSD许可。