核心数据 NSFetchedResultsController 代码缩短

Posted

技术标签:

【中文标题】核心数据 NSFetchedResultsController 代码缩短【英文标题】:Core Data NSFetchedResultsController code shortenning 【发布时间】:2014-08-01 00:58:53 【问题描述】:

所以我对 Core Data 很陌生,并决定使用 Magical Record 来减少 LOC。

在我的第一个视图中,我有一个公司列表,每个公司都有 N 个用户

目前,我设法让一切正常工作,但我的代码太长了。

我想做的是缩短代码,因为我知道我可以,我只是不知道怎么做。

如果你看下面的代码,你会看到调用 NSFetchedResultsController 时常用的一行

[self.fetchedResultsController.sections[0]objects]

有没有办法减少这种情况,所以我不必访问 NSFRC 的索引 0? 我可以做类似的事情吗

self.fetchedResultsController = [self.fetchedResultsController.sections[0]objects]

感谢您的宝贵时间

更新: 我想我可以从 fetched results 控制器中获取一个数组并使用它?

NSArray *companies = [NSArray arrayWithArray:[self.fetchedResultsController.sections[0]objects]];

我的对象还会保持相同的内存地址吗?

#pragma mark Fetched results controller

- (NSFetchedResultsController *)fetchedResultsController 
    // Set up the fetched results controller if needed.
    if (_fetchedResultsController == nil) 

        self.fetchedResultsController = [Company MR_fetchAllSortedBy:nil ascending:YES withPredicate:nil groupBy:nil delegate:self inContext:self.managedObjectContext];
    

    return _fetchedResultsController;


#pragma mark - Table View Data Source

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView

    return [[self.fetchedResultsController.sections[0]objects] count];



- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section

    NSString *string = [[[self.fetchedResultsController.sections[0]objects]objectAtIndex:section]title];
    return string;


- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section


    return [[[[[self.fetchedResultsController.sections[0]objects]objectAtIndex:section]users] allObjects] count];



- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

    static NSString *cellIdentifier = @"cell_identifier";
    [tableView registerClass:[UITableViewCell class]  forCellReuseIdentifier:cellIdentifier];
    TableViewCell *cell = [[TableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:cellIdentifier];

    UserProfile *user = [[[[[self.fetchedResultsController.sections[0] objects]objectAtIndex:indexPath.section] users] allObjects]objectAtIndex:indexPath.row];


    cell.textLabel.text = user.title;
    cell.detailTextLabel.text = user.email;

    return cell;

【问题讨论】:

【参考方案1】:

我想如果你只是使用

-[self.fetchedResults objectAtIndexPath:indexPath]

您将在此处获得的数据访问代码大大减少。

另外,不要这样做:

[tableView registerClass:[UITableViewCell class]  forCellReuseIdentifier:cellIdentifier];

在您的 tableView:cellForRowAtIndexPath: 方法中。通常,在 viewDidLoad: 或其他一些初始化方法中执行此操作。

而且,我个人也会使用 -[NSArray lastObject] 或 -[NSArray firstObject] 方法。如果数组中没有对象,这些方法将返回 nil,而不是因为数组索引超出范围异常而崩溃。

【讨论】:

以上是关于核心数据 NSFetchedResultsController 代码缩短的主要内容,如果未能解决你的问题,请参考以下文章

如何按创建 UITableViewCell 时计算的值对 UITableView 进行排序?

启动 Core Data 应用程序时在后台配置 NSFetchedResultsController

大数据核心技术都有哪些

哪里不使用核心数据?是不是可以将核心数据用作 MySql 之类的数据库?

使用 MKMapView、核心位置和核心数据

大数据三大核心技术:拿数据、算数据、卖数据!