添加到关系后未在核心数据中找到对象
Not found an object in coredata after added to a relationship
我在添加关系后获取对象时遇到问题。我第一次获取类别时,总是找到,然后当我添加到关系时,找不到以下类别。
关系是Many-To-Many
。
示例:
- 使用
categoryId = 10
获取类别
- 找到类别对象
- 添加到父对象关系
- 下一个对象
如果几个分类相同id
,categoryId = 10
,找不到
NSManagedObjectContext *private = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];
[private setParentContext:self.model.context];
__block NSError *error = nil;
[private performBlockAndWait:^{
GPDeal *deal = [EKManagedObjectMapper objectFromExternalRepresentation:dic withMapping:[GPDeal objectMapping] inManagedObjectContext:private];
for (NSDictionary *dic in responseObject[@"response"]) {
GPCategory *category;
//The first time always found
if ((category = [GPCategory MR_findFirstByAttribute:@"catId" withValue:dic[@"mainAttribute"] inContext:private])) {
NSLog(@"Found");
[category addDealsObject:deal];
} else {
NSLog(@"Not Found");
}
}
}];
NSError *PrivateError = nil;
if (![private save:&PrivateError]) {
NSLog(@"Unresolved error %@, %@", PrivateError, [PrivateError userInfo]);
abort();
}
if (!error) {
//Save on main moc
[self.model saveWithErrorBlock:^(BOOL success, NSError *error) {
if (!success) {
NSLog(@"Error saving context: %@\n%@", [error localizedDescription], [error userInfo]);
}
}];
} else {
NSLog(@"Error saving context: %@\n%@", [error localizedDescription], [error userInfo]);
}
编辑:
已解决,我想我的问题是我忘记在每次迭代结束时保存主上下文。
NSManagedObjectContext *backgroundMOC = [self.model backgroundMOC:self.model.context];
[backgroundMOC performBlockAndWait:^{
for (NSDictionary *dic in responseObject[@"response"]) {
GPDeal *deal = [EKManagedObjectMapper objectFromExternalRepresentation:dic withMapping:[GPDeal objectMapping] inManagedObjectContext:backgroundMOC];
GPCategory *category;
if ((category = [GPCategory MR_findFirstByAttribute:@"catId" withValue:dic[@"mainAttribute"] inContext:backgroundMOC])) {
NSLog(@"Found with mainAttribute %@", dic[@"mainAttribute"]);
[deal addDealCategoryObject:category];
}
if([backgroundMOC hasChanges]) {
NSError * error;
[backgroundMOC save:&error];
[self.model.context performBlockAndWait:^{
if([self.model.context hasChanges]) {
NSError * error;
[self.model.context save:&error];
}
}];
}
}
}];
您可能缺少保存MOC链。为清楚起见,我将关键字 private
替换为变量名称 backgroundMOC
.
关于上述问题,我只能假设 NSManagedObjectContext *private = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];
行在技术上类似于:
- (NSManagedObjectContext *)backgroundMOC:(NSManagedObjectContext *)mainMOC
{
NSManagedObjectContext * threadManagedObjectContext = [[NSManagedObjectContext alloc]
initWithConcurrencyType:NSPrivateQueueConcurrencyType];
[threadManagedObjectContext setParentContext:mainMOC];
[threadManagedObjectContext setMergePolicy:NSMergeByPropertyObjectTrumpMergePolicy];
return threadManagedObjectContext;
}
传递 self.model.context
作为 mainMOC,带有 self.model.context
和 setMergePolicy
。
同样,我必须假设 self.model saveWithErrorBlock
在技术上等同于:
[mainMOC performBlockAndWait:^{
if([mainMOC hasChanges]) {
NSError * error;
[mainMOC save:&error];
// handle error
}
}];
如果是这样,backgroundMOC
(您的 private
参考)也应该这样说:
[backgroundMOC performBlockAndWait:^{
if([backgroundMOC hasChanges]) {
NSError * error;
[backgroundMOC save:&error];
// handle error
}
}];
换句话说,您要确保 backgroundMOC
和 mainMOC
保存操作是从各自的线程执行的,performBlockAndWait
.
我在添加关系后获取对象时遇到问题。我第一次获取类别时,总是找到,然后当我添加到关系时,找不到以下类别。
关系是Many-To-Many
。
示例:
- 使用
categoryId = 10
获取类别
- 找到类别对象
- 添加到父对象关系
- 下一个对象
如果几个分类相同
id
,categoryId = 10
,找不到NSManagedObjectContext *private = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType]; [private setParentContext:self.model.context]; __block NSError *error = nil; [private performBlockAndWait:^{ GPDeal *deal = [EKManagedObjectMapper objectFromExternalRepresentation:dic withMapping:[GPDeal objectMapping] inManagedObjectContext:private]; for (NSDictionary *dic in responseObject[@"response"]) { GPCategory *category; //The first time always found if ((category = [GPCategory MR_findFirstByAttribute:@"catId" withValue:dic[@"mainAttribute"] inContext:private])) { NSLog(@"Found"); [category addDealsObject:deal]; } else { NSLog(@"Not Found"); } } }]; NSError *PrivateError = nil; if (![private save:&PrivateError]) { NSLog(@"Unresolved error %@, %@", PrivateError, [PrivateError userInfo]); abort(); } if (!error) { //Save on main moc [self.model saveWithErrorBlock:^(BOOL success, NSError *error) { if (!success) { NSLog(@"Error saving context: %@\n%@", [error localizedDescription], [error userInfo]); } }]; } else { NSLog(@"Error saving context: %@\n%@", [error localizedDescription], [error userInfo]); }
编辑:
已解决,我想我的问题是我忘记在每次迭代结束时保存主上下文。
NSManagedObjectContext *backgroundMOC = [self.model backgroundMOC:self.model.context];
[backgroundMOC performBlockAndWait:^{
for (NSDictionary *dic in responseObject[@"response"]) {
GPDeal *deal = [EKManagedObjectMapper objectFromExternalRepresentation:dic withMapping:[GPDeal objectMapping] inManagedObjectContext:backgroundMOC];
GPCategory *category;
if ((category = [GPCategory MR_findFirstByAttribute:@"catId" withValue:dic[@"mainAttribute"] inContext:backgroundMOC])) {
NSLog(@"Found with mainAttribute %@", dic[@"mainAttribute"]);
[deal addDealCategoryObject:category];
}
if([backgroundMOC hasChanges]) {
NSError * error;
[backgroundMOC save:&error];
[self.model.context performBlockAndWait:^{
if([self.model.context hasChanges]) {
NSError * error;
[self.model.context save:&error];
}
}];
}
}
}];
您可能缺少保存MOC链。为清楚起见,我将关键字 private
替换为变量名称 backgroundMOC
.
关于上述问题,我只能假设 NSManagedObjectContext *private = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];
行在技术上类似于:
- (NSManagedObjectContext *)backgroundMOC:(NSManagedObjectContext *)mainMOC
{
NSManagedObjectContext * threadManagedObjectContext = [[NSManagedObjectContext alloc]
initWithConcurrencyType:NSPrivateQueueConcurrencyType];
[threadManagedObjectContext setParentContext:mainMOC];
[threadManagedObjectContext setMergePolicy:NSMergeByPropertyObjectTrumpMergePolicy];
return threadManagedObjectContext;
}
传递 self.model.context
作为 mainMOC,带有 self.model.context
和 setMergePolicy
。
同样,我必须假设 self.model saveWithErrorBlock
在技术上等同于:
[mainMOC performBlockAndWait:^{
if([mainMOC hasChanges]) {
NSError * error;
[mainMOC save:&error];
// handle error
}
}];
如果是这样,backgroundMOC
(您的 private
参考)也应该这样说:
[backgroundMOC performBlockAndWait:^{
if([backgroundMOC hasChanges]) {
NSError * error;
[backgroundMOC save:&error];
// handle error
}
}];
换句话说,您要确保 backgroundMOC
和 mainMOC
保存操作是从各自的线程执行的,performBlockAndWait
.