使用专用队列 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 上下文中获取。
我终于进入我的待办事项列表项以更新旧的应用程序代码,以便为我的 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 上下文中获取。