【发布时间】:2015-04-26 05:30:24
【问题描述】:
正如标题所说,如何访问已在一个块中创建然后需要在另一个块中访问的 NSManagedObject。我有以下实现,想知道它是否正确。
__block Person *newPerson;
@weakify(self);
[MagicalRecord saveWithBlock:^(NSManagedObjectContext *localContext) {
newPerson = [Person MR_createInContext:localContext];
newPerson.name = @"Bob";
} completion:^(BOOL success, NSError *error) {
@strongify(self);
// Called on main thread
PersonViewController *personVC = [[PersonViewController alloc] initWithPerson:newPerson];
[self.navigationController pushViewController:personVC animated:YES];
}];
我不需要从完成处理程序中的 localContext 访问 newPerson 是否正确,因为它将在主线程上执行?
编辑
建议的方式如下:
__block NSManagedObjectID *newPersonObjectID;
@weakify(self);
[MagicalRecord saveWithBlock:^(NSManagedObjectContext *localContext) {
Person *newPerson = [Person MR_createInContext:localContext];
newPerson.name = @"Bob";
newPersonObjectID = newPerson.objectID;
} completion:^(BOOL success, NSError *error) {
@strongify(self);
// Called on main thread
Person *savedPerson = [[NSManagedObjectContext MR_defaultContext] objectWithID:newPersonObjectID];
PersonViewController *personVC = [[PersonViewController alloc] initWithPerson:savedPerson];
[self.navigationController pushViewController:personVC animated:YES];
}];
解决方案
这个答案和 cmets 导致以下解决方案。 一个 TemporaryID 在保存时被分配给对象,因此在尝试使用 TempID 获取对象时会发生异常。
与其创建一个全新的获取请求,不如让上下文提前获取永久 ID,而不是获取对象的永久 ID。例如:
__block NSManagedObjectID *newPersonObjectID;
@weakify(self);
[MagicalRecord saveWithBlock:^(NSManagedObjectContext *localContext) {
Person *newPerson = [Person MR_createInContext:localContext];
newPerson.name = @"Bob";
[localContext obtainPermanentIDsForObjects:@[newPerson] error:NULL];
newPersonObjectID = newPerson.objectID;
} completion:^(BOOL success, NSError *error) {
@strongify(self);
// Called on main thread
Person *savedPerson = [[NSManagedObjectContext MR_defaultContext] objectWithID:newPersonObjectID];
PersonViewController *personVC = [[PersonViewController alloc] initWithPerson:savedPerson];
[self.navigationController pushViewController:personVC animated:YES];
}];
【问题讨论】:
-
我们回答了您的问题吗?如果社区仍然可以为您提供任何具体的帮助,您可以编辑您的问题!
标签: ios core-data nsmanagedobject nsmanagedobjectcontext magicalrecord