【问题标题】:passing core data object without saving传递核心数据对象而不保存
【发布时间】:2016-05-09 01:12:56
【问题描述】:

我正在尝试将核心数据对象从一个控制器传递到另一个控制器而不保存更改。但我得到CoreData:错误:变异托管对象0x14f70f510

代码如下:

- (void) collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath {

NSManagedObjectContext *localContext = [NSManagedObjectContext MR_context];
Item *item  = [Item MR_createEntityInContext:localContext];
item.code = indexPath.row;

NextController *controller = [[NextController alloc] initWithItem:item];
[self.navigationController pushViewController:controller animated:YES];
}

我不想立即保存数据的原因是我想等到用户完成创建新项目的过程。

【问题讨论】:

  • 马上保存并在里面放个flag说它已经完成了,这样会容易得多,你可以移动NSManagedObjects,但是很痛苦

标签: ios core-data magicalrecord magicalrecord-2.2


【解决方案1】:

试试这个:

当你选择一个项目时调用执行一个转场

- (void) collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath {

    [self performSegueWithIdentifier:@"mySegue" sender:sender];

}

创建 NSManagedObject 并将其传递给您要推送到的视图控制器。

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    if ([[segue identifier] isEqualToString:@"mySegue"]) { 
        NSIndexPath *path = [self.tableView indexPathForSelectedRow];

        NSManagedObjectContext *localContext = [NSManagedObjectContext MR_context];
        Item *item  = [Item MR_createEntityInContext:localContext];
        item.code = path.row;

        CustomViewController *vc = [segue destinationViewController]
        [vc theNameOfTheNSManagedObjectInTheVCYouPushTo: item]
    }
}

【讨论】:

  • 我没有使用故事板,所以我不能这样做。我试过 NextController *controller = [[NextController alloc] init];控制器.item = 项目; [self.navigationController pushViewController:控制器动画:YES];但它仍然给我核心数据错误。
【解决方案2】:

在每次整个操作后保存它,这是MagicalRecord 推荐的,因为您的应用可能随时崩溃或被用户终止。
还有一件事,[item MR_inContext:localContext] 将获得该项目的永久对象 ID。这可能会有所帮助。

【讨论】:

  • 谢谢,但我不保存就通过它的目的是我不想存储不必要的数据。我只想在用户完成整个流程时保存它。我可以通过创建常规对象来做到这一点,但由于我已经有了包含核心数据的数据模型,所以做两次似乎是多余的。
【解决方案3】:

您正在 localContext 中创建新实体,如果您想对它做一些事情,您还应该将此 localContext 作为参数传递。

我的意思是下一个:

NextController *controller = [[NextController alloc] initWithItem:item];

用作:

NextController *controller = [[NextController alloc] initWithItem:item yourLocalContext:localContext];

在这种情况下,您可以更改您的项目

【讨论】:

    猜你喜欢
    • 2013-08-19
    • 1970-01-01
    • 1970-01-01
    • 2011-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-09
    • 1970-01-01
    相关资源
    最近更新 更多