我有持久存储的核心数据结构< - >主线程上下文< - >私有线程上下文(用作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的
答案 0 :(得分:3)
nil
中的某些内容您不希望成为nil
。
原因如下:objectWithID:
始终返回一个对象。但是你得到了nil
。最可能的原因是self.databaseConnector.getContext
实际上在该块中返回nil
。可能accountForMagazine
也 nil
但如果这是唯一的意外nil
那么您的应用就会崩溃(无法通过{{1}那个方法和现场)。