代码之家  ›  专栏  ›  技术社区  ›  BYZZav

尽管objectId有效,但NSManagedObjectContext objectWithId未返回对象

  •  0
  • BYZZav  · 技术社区  · 11 年前

    我有一个持久存储<->主线程上下文<->专用线程上下文(用作草稿页)。

    我的用户在“私人线程”/草稿页上下文上创建和配置杂志对象后,按下“保存”。

    我从主线程上下文中获取当前登录的帐户,因为要创建的新杂志必须分配一个帐户。

    Account* accountForMagazine = [self.accountsConnector getSelectedAccount];
    NSLog(@"object id: %@",accountForMagazine.objectID);
    

    对象id NSLog输出为:

    0xa677790 <x-coredata://F635CE5A-C335-48F0-BB27-61B7D9XXXXD8/Account/p4>
    

    所以它是一个永久id,它告诉我对象在持久存储中。

    然后,我切换到专用线程(databaseConnector只是专用线程上托管对象上下文的包装器),并尝试将该帐户对象带到线程上,以便将其分配给要保存的杂志对象。

    [self.databaseConnector executeOnCorrectThread:^
    {
        Account* account = (Account*)[self.databaseConnector.getContext objectWithID:accountForMagazine.objectID];
        self.magazine.account = account;
        if(!account) { NSLog(@"nil account"); }
        [self.databaseConnector save];
    }
    

    我遇到的问题是,尽管新的杂志对象正在保存并进入持久存储,但它们都没有连接到帐户!当然,每次都会显示NSLog语句,表示该线程上的帐户对象为nil。

    因此,即使我有一个有效的objectId,因此该对象存在于持久存储中,我也不会通过objectWithId在私有线程上获得帐户对象。

    有什么想法吗?

    谢谢

    电压b

    1 回复  |  直到 11 年前
        1
  •  3
  •   Tom Harrington    11 年前

    里面有东西 nil 你不希望成为 .

    原因如下: objectWithID: 总是 返回一个对象。但你得到了 。最有可能的原因是 self.databaseConnector.getContext 实际上正在返回 在那个街区。可能是这样 accountForMagazine 而且 但如果这是唯一出乎意料的 那么你的应用程序就会崩溃(无法通过 去那种方法和生活)。