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

时间:2013-04-04 21:59:53

标签: ios core-data

我有持久存储的核心数据结构< - >主线程上下文< - >私有线程上下文(用作scratchpads)。

我的用户在“私有线程”/暂存器上下文中创建和配置杂志对象后按“保存”。

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

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语句 - 说明此线程上的帐户对象为零。

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

为什么会这样?

由于

Vb的

1 个答案:

答案 0 :(得分:3)

nil中的某些内容您不希望成为nil

原因如下:objectWithID: 始终返回一个对象。但是你得到了nil。最可能的原因是self.databaseConnector.getContext实际上在该块中返回nil。可能accountForMagazine nil但如果这是唯一的意外nil那么您的应用就会崩溃(无法通过{{1}那个方法和现场)。