更改未使用魔法记录保存的属性

时间:2015-03-19 19:28:12

标签: ios core-data nsfetchedresultscontroller magicalrecord

我正在使用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;
    }
}

谢谢!

2 个答案:

答案 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 
}];