问题描述
我终于到达待办事项列表项,以更新旧的应用程序代码以将私有队列用于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进行新的提取。 - 从主队列上下文中获取。