核心数据 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