SNRFetchedResultsController 0.0.1

SNRFetchedResultsController 0.0.1

测试测试过的
语言语言 Obj-CObjective C
许可 BSD
发布最近一次发布2014年12月

未声明 维护。



  • Indragie Karunaratne

SNRFetchedResultsController: OS X 自动 Core Data 变更跟踪

SNRFetchedResultsController 是从 iOS 到 OS X 的 NSFetchedResultsController 的“移植” (NSFetchedResultsController 的一个“移植”,而不是直接替代品)。它不是 NSFetchedResultsController 的直接替代品,但它执行了许多相同的任务,与管理和通知代理对象插入、删除、更新或移动有关以更新 UI。

该项目处于早期阶段,可能存在一些(很多)错误。任何反馈、错误报告和代码贡献都将深受欢迎。

NSFetchedResultsController 与 SNRFetchedResultsController 对比

限制

  • SNRFetchedResultsController 不支持分区或缓存,主要是因为(与 UITableView 不同)NSTableView 不支持分区。尽管如此,SNRFetchedResultsController 可以与支持分区的自定义 UI 控件一起使用,所以这将是未来要添加的不错功能。

差异

  • 由于没有分区支持,SNRFetchedResultsController 使用索引 (NSUInteger) 而不是 NSIndexPath

自动引用计数 (ARC)

该项目假设代码将在 ARC 环境下编译。这意味着没有内存管理代码存在,因此如果您打算在非 ARC 项目中使用此类,则必须手动插入正确的引用/释放调用,或者您必须使用带有 -fobjc-arc 标志编译 SNRFetchedResultsController.m

示例用法

创建一个 fetched results controller

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]);
}

NSTableViewDataSource 实现方法

- (NSInteger)numberOfRowsInTableView:(NSTableView *)aTableView
{
    return [self.fetchedResultsController count];
}
- (id)tableView:(NSTableView *)aTableView objectValueForTableColumn:(NSTableColumn *)aTableColumn row:(NSInteger)rowIndex
{
    return [self.fetchedResultsController objectAtIndex:rowIndex];
}

为 NSTableView 实现 SNRFetchedResultsControllerDelegate

- (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许可