我正在使用Magical Record来管理我的核心数据堆栈。在我的应用程序中,我一直在使用saveWithBlock方法进行保存,一切正常。 但是,在一次特定保存中,不会保存更改。我正在尝试将新组添加到现有照片对象中。
我尝试在保存前打印photos.groups.count,在完成块之后,计数会增加。但是当我使用相同的照片再次运行此代码时,photos.groups.count会返回1,这意味着没有添加新的组。
//check if this asset has been processed before
__block PTPhoto *photo = [PTPhoto fetchWithAsset:asset];
if (photo && ![[photo groups] containsObject:group]) {
[MagicalRecord saveWithBlock:^(NSManagedObjectContext *localContext) {
PTGroup *localGroup = [group MR_inContext:localContext];
photo = [photo MR_inContext:localContext];
[photo addGroup:localGroup];
[photo addGroupsObject:localGroup];
} completion:^(BOOL success, NSError *error) {
[[PTNetwork defaultNetwork] updatePhoto:photo WithAddedGroup:group WithCompletion:^{
dispatch_group_leave(ProcessImageGroup());
}];
}];
}
我编写了自己的addGroup方法,将项目添加到NSSet
-(void)addGroup:(PTGroup *)group {
NSMutableSet *mutableGroups = [self mutableSetValueForKey:@"groups"];
[mutableGroups addObject:group];
}
我也试过使用核心数据生成的方法没有运气
@interface PTPhoto (CoreDataGeneratedAccessors)
- (void)addGroupsObject:(PTGroup *)value;
这是我获取现有照片的方式:
+ (PTPhoto *)fetchWithAsset:(PHAsset *)asset {
NSFetchRequest *request = [[NSFetchRequest alloc] init];
NSPredicate *assetPredicate = [NSPredicate predicateWithFormat:@"localID == %@", [asset localIdentifier]];
[request setPredicate:assetPredicate];
[request setEntity:[PTPhoto entityWithContext:[NSManagedObjectContext MR_defaultContext]]];
NSError *error;
NSArray *array = [[NSManagedObjectContext MR_defaultContext] executeFetchRequest:request error:&error];
if ([array count]) {
return array[0];
} else {
return nil;
}
}
谢谢!
答案 0 :(得分:0)
PTPhoto和PTGroup是1对多关系。
而不是使用
[photo addGroup:localGroup];
[photo addGroupsObject:localGroup];
尝试以下几行
[localGroup setPhoto:photo];
答案 1 :(得分:0)
我打算将此作为评论发布,但有点太长了。
我不确定我是否相信MR_inContext的实现是线程安全的。据我所知,从不同的上下文访问objectID
照片似乎违反了Coredata的线程限制。如果您尝试以下操作会发生什么:
PTPhoto *photo = [PTPhoto fetchWithAsset:asset];
NSManagedObjectID *photoID = [photo objectID];
[MagicalRecord saveWithBlock:^(NSManagedObjectContext *localContext) {
Photo *localPhoto = [localContext objectWithID:photoID];
// add photo to group
} completion:^(BOOL success, NSError *error) {
// You can also try refreshing your photo object on completion to make sure it is not stale
[[NSManagedObjectContext MR_defaultContext] refreshObject:photo mergeChanges:YES];
// Do your other network stuff
}];