- 我应该通过不仅仅是他们的“标识”主线程才能重新获取 他们在主ManagedContext?我可以怎样处理计算得到的瞬态 信息(要在表格的 单元中显示其他数据)。
- 难道我不能把它们传回来显示吗?
没有必要经过IDS的,你可以很容易地调用的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;
}
- 对于最后一个问题,我可以“锁定” ManagedContext确保数据通过没有任何问题(我读过这可能是一个选项)?
一旦检索到对象,如果您只有一张表,就不需要锁定CoreData。否则,如果你意识到后台线程可能会改变你已经显示的数据,并且你的表格可以被编辑和保存,你必须设置一个重要的逻辑来处理这个问题。否则你会得到一个“不一致性错误”。但是如果你有一个只读表,例如你可以提醒控制器是否有人更改了数据,并要求他们重新加载表。
- 是核心数据占用这个用法?我应该考虑另一种方法/技术吗?
是的,你应该注意的唯一一点是你在做什么样的计算。最常见的错误是将CoreData视为SQL数据库而不是对象图(我经常犯的错误),因此很多粒子和准确的类似于SQL的操作是不可能的。在许多情况下,您将结束检索基于标准的集合,您必须在内存计算中进一步做更多工作。但说实话,尽管有许多人说,除非你有一千条记录,否则我发现所有的iOS设备对于合理的数据量都非常快。
感谢您的回答。
我问了第一个问题,因为它总是说“永远不要跨越线程边界”。
我来自Java编程,并且存在“不是线程安全”,它与“不要在线程之间传递”不一样。你只需要知道你在做什么,并明智地使用“同步”。但是,一些信息可能会绑定到线程,这可能是原因。
我的代码其实和你的代码非常相似。 – JZarzuela 2012-03-01 19:34:02