我对核心数据完全陌生,我想知道我想要做的以下任务的最佳方法(即使我应该使用核心数据):
我有几个实体,它们之间有不同的1对1和1对多的关系。
我想在表格视图中向用户显示“合并”的信息集
要获得“合并”信息,我必须做的不仅仅是获取一些行。我需要得到一些实体,根据一些算法过滤它们,计算一些信息(存储在瞬态属性中)等。
一旦我得到了结果(一组简化的实例),我想向用户展示
因为这是一项繁重的任务,我想在一个单独的后台线程中执行它
说,当我准备好一组选定的ManagedObject:
我应该只将他们的“ID”传递给主线程,以便在主ManagedContext中重新获取它们吗?如何计算瞬态信息(与表格单元格中的其他数据一起显示)。
难道我不能只是将它们传回去展示吗?
对于最后一个问题,我可以“锁定”ManagedContext以确保数据传递没有任何问题(我读过这可能是一个选项)?
核心数据是否适用于此用途?我应该考虑另一种方法/技术吗?
提前致谢
答案 0 :(得分:1)
无需传递ID,您可以轻松调用NSOperation进行计算并检索和存储您的对象集,然后在计算结束时只需调用:
[tableView performSelectorOnMainThread:@selector(reloadData) withObject:nil waitUntilDone:YES];
这将触发表再次调用其委托选择器。重要的是您必须将检索到的对象存储在委托选择器可以访问的数据源中,例如,可以是NSArray:
@property(nonatomic,strong) NSArray *datasource;
-(void)loadDataAsynchronously {
NSOperationQueue *queue = [NSOperationQueue new];
NSInvocationOperation *operation = [[NSInvocationOperation alloc] initWithTarget:self
selector:@selector(loadData)
object:nil];
[queue addOperation:operation];
}
-(void)loadData{
// do your calculation and store into array
self.datasource=......
// reload on main thread
[tableView performSelectorOnMainThread:@selector(reloadData) withObject:nil waitUntilDone:YES];
}
- (UITableViewCell *)tableView:(UITableView *)table cellForRowAtIndexPath:(NSIndexPath *)indexPath {
YourObject *obj = [[self datasource] objectAtIndex:indexPath.row];
YourTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"tableCell"];
cell.cellTitle.text=obj.titleForCell;
cell.cellDescr.text=obj.descriptionForCell;
return cell;
}
一旦检索到对象,如果您有一个只读表,就不需要锁定CoreData。否则,如果您知道后台线程可能已经更改了您已经显示的数据,并且您的表可以编辑和保存,那么您必须设置一个重要的逻辑来处理它。或者您将收到“不一致错误”。但是如果你有一个只读表,你可以举例告诉控制器,如果有人更改了数据,并要求他们重新加载表。
是的,你应该注意的唯一一点是你正在做什么样的计算。最常见的错误是将CoreData视为SQL数据库而不是对象图(我最常做的错误),因此无法进行许多粒子和精确的类似SQL的操作。在许多情况下,您将结束检索基于标准的集合,您必须在内存计算中进一步执行此操作。但老实说,尽管许多人说,除非你有数千条记录,否则我发现所有的iOS设备都非常快,以获得合理数量的数据。