2012-02-27 36 views
0

我完全新的核心数据和我想知道下面的任务,我想要做的(即使我应该使用核心数据的话)的最佳方法:另一个多线程核心数据使用

  • 我有几个不同的1对1和1对多关系的实体。

  • 我想显示“合并”的信息给用户在表视图

  • 组要获得“合并”的信息,我需要做的不是简单地抓取了一些行等等。我需要得到一些实体,根据一些算法进行筛选,确定某些信息(存储在瞬态性能)等

  • 一旦有了结果(一组实例的降低)我要展示给用户

  • 因为它是一个沉重的任务,我想在一个分离的后台线程来执行它


说,当我有一组选择ManagedObject的准备:

  • 我是否应该仅将其“ID”传递给主线程以便在主ManagedContext中重新获取它们?我可以怎样处理计算出来的瞬态信息(要在表格单元格中显示其他数据)。

  • 难道我不能只是将它们传回才显示?

  • 对于最后一个问题,我可以“锁定”ManagedContext以确保数据传递没有任何问题(我读过这可能是一个选项)?

  • 核心数据是否适用于此用途?我应该考虑另一种方法/技术吗?


预先感谢

回答

1
  • 我应该通过不仅仅是他们的“标识”主线程才能重新获取 他们在主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设备对于合理的数据量都非常快。

+0

感谢您的回答。
我问了第一个问题,因为它总是说“永远不要跨越线程边界”。
我来自Java编程,并且存在“不是线程安全”,它与“不要在线程之间传递”不一样。你只需要知道你在做什么,并明智地使用“同步”。但是,一些信息可能会绑定到线程,这可能是原因。
我的代码其实和你的代码非常相似。 – JZarzuela 2012-03-01 19:34:02