【问题标题】:Changed property not saved with Magical Record更改的属性未与 Magical Record 一起保存
【发布时间】:2015-03-19 19:28:12
【问题描述】:

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

谢谢!!

【问题讨论】:

    标签: ios core-data nsfetchedresultscontroller magicalrecord


    【解决方案1】:

    PTPhoto 和 PTGroup 是一对多的关系。

    而不是使用

    [photo addGroup:localGroup];
    [photo addGroupsObject:localGroup];
    

    试试下面几行

    [localGroup setPhoto:photo];
    

    【讨论】:

      【解决方案2】:

      我打算把这个作为评论发布,但它有点太长了。

      我不确定我是否相信 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 
      }];
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-06-22
        • 1970-01-01
        相关资源
        最近更新 更多