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

问题描述

我终于到达待办事项列表项,以更新旧的应用程序代码以将私有队列用于NSManagedobjectContext,但是我遇到了一些尴尬的情况,找不到我认为明确的答案

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

这使我在表视图等方面遇到问题。例如:

- (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线程访问对象值时,可以这样做吗?

以上是一个非常简单的示例,仅用于解释我的观点,但是在我的代码中,我有更复杂的示例。就像处理滑动动作时一样,我感觉我在ui-private-ui-private-ui之间来回弹跳,以便于处理按钮上的点击。

解决方法

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

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

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