我正在尝试将数据导入核心数据并将其保存在后台线程中魔幻唱片.
我基本上正在尝试这样做:
__block User *user = nil;
[MagicalRecord saveWithBlockAndWait:^(NSManagedObjectContext *localContext)
{
user = [User MR_findFirstOrCreateByAttribute:@"userId" withValue:userId inContext:localContext];
[user MR_importValuesForKeysWithObject:responseObject];
}];
[User setCurrentUser:user];
当我在街区内时,用户是正确的。区块完成后user
is a NS管理对象对象,但没有设置任何属性。
另一方面,这有效:
OEUser *user = [OEUser MR_findFirstOrCreateByAttribute:@"userId" withValue:userId];
[user MR_importValuesForKeysWithObject:responseObject];
[[NSManagedObjectContext MR_defaultContext] MR_saveToPersistentStoreAndWait];
[User setCurrentUser:user];
但我想将其保存在后台。
我也尝试过这个没有效果。
User *user = [User MR_findFirstOrCreateByAttribute:@"userId" withValue:userId];
[MagicalRecord saveWithBlockAndWait:^(NSManagedObjectContext *localContext)
{
User *localUser = [user MR_inContext:localContext];
[user MR_importValuesForKeysWithObject:responseObject];
}];
[User setCurrentUser:user];
这里的问题似乎是[user MR_inContext:localContext]
回报nil.
我对核心数据还很陌生,所以如果我遗漏了一些明显的东西,请耐心等待。
当您使用*Wait
方法你没有获得任何异步性,并且在导入期间你仍然会阻塞你的主线程。您确实应该使用块方法,但这可以确保任何核心数据操作都在正确的线程(线程NSManagedObjectContext
创建于)。
当你使用saveWithBlockAndWait:
MagicalRecord 在后台线程上创建一个新的上下文来执行其工作。然后,这个新创建的上下文将被生成到您的块中,并且仅在该块的范围内存在。你无法通过NSManagedObject
位于上下文之间,因此您不应尝试从块外部捕获用户。
我可以想象第二个例子实际上只会在创建一个新的情况下失败User
因为你打电话MR_findFirstOrCreateByAttribute:withValue:
这将创建一个新的NSManagedObject
在内存中,但这不会持久保存到存储中,因此在saveWithBlockAndWait:
没有User
从商店拉。
正确的方法是
[MagicalRecord saveWithBlockAndWait:^(NSManagedObjectContext *localContext) {
User *localUser = [User MR_findFirstOrCreateByAttribute:@"userId"
withValue:userId
inContext:localContext];
[user MR_importValuesForKeysWithObject:responseObject];
}];
User *user = [User MR_findFirstByAttribute:@"userId" withValue:userId];
[User setCurrentUser:user];
如前所述,这将阻塞主线程,因此您可能需要考虑转向saveWithBlock:completion:
相反,它将在后台执行工作并且不会阻塞当前线程。
更好的是我会考虑不持有实际的User
对象,而是抓住userId
,当人们开始访问时,这将使您不再头痛currentUser
来自各种线程
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)