使用专用队列 NSManagedObjectContext,我是否需要访问专用队列上 NSManagedObjects 的属性?

With a Private Queue NSManagedObjectContext, do I need to access properties of NSManagedObjects on the private queue?

我终于进入我的待办事项列表项以更新旧的应用程序代码,以便为我的 NSManagedObjectContext 使用私有队列,但我 运行 遇到了一些尴尬的情况,我找不到我认为一个明确的答案。

如果我正在访问 NSManagedObject 上的简单属性,我是否也需要在专用队列上执行此操作?

这让我在 table 视图等方面出现问题。例如:

- (UITableViewCell *) tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    NSManagedObject *object = [self.fetchedResultsController objectAtIndexPath:indexPath];

    UITableViewCell *cell = [self.tableView dequeueReusableCellWithIdentifier:@"Cell" forIndexPath:indexPath];
    
    cell.textLabel.text = [object valueForKey:@"name"];
}

当我的上下文在私有队列中并且我正在从主 ui 线程访问对象值时,这样做可以吗?

上面是一个非常简单的例子,只是为了解释我的观点,但我的代码中有更复杂的例子。就像在处理 building 滑动动作时,我觉得我在 ui-private-ui-private-ui 之间来回跳动,以便处理按钮上的点击。

托管对象只能在获取它们的队列上使用,因此如果您在私有队列上获取,则只能在该队列上使用该对象。这包括访问对象的属性。此规则有一些例外情况——例如,您可以查找托管对象 ID,并执行一些其他基本操作(请参阅 the class docs 以获取完整列表),但这在这里没有直接帮助.

根据您应用的详细信息,以下一项或多项可能会有所帮助:

  • 使用 performBlockAndWait: 检索 属性 值。如果专用队列忙于其他事情,这可能会阻塞 UI。
  • 通过将提取请求上的 resultType 设置为 NSDictionaryResultType,将提取请求更改为获取字典而不是托管对象作为提取结果。如果您只是读取数据,这很好,但保存更改可能会很尴尬,因为您没有可处理的托管对象。
  • 获取对象的 ID,然后使用 objectWithId: 在使用主队列的不同上下文中查找相同的对象。或者,如果您有一堆对象,您可以再次在主队列上对所有对象 ID 进行新的提取。
  • 从 main-queue 上下文中获取。