更改的属性未与 Magical Record 一起保存

Posted

技术标签:

【中文标题】更改的属性未与 Magical Record 一起保存【英文标题】:Changed property not saved with 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;
    

谢谢!!

【问题讨论】:

【参考方案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 
];

【讨论】:

以上是关于更改的属性未与 Magical Record 一起保存的主要内容,如果未能解决你的问题,请参考以下文章

Magical Record 似乎可以保存,但如果应用程序终止,更改会丢失

尝试将 Magical Record 与 Kiwi 一起使用时构建测试时出错

使用 Magical Record 添加到创建的实体属性

Magical Record 手动丢弃对尚未保存到数据库的所有实体的所有更改

Magical Record 检测到默认上下文没有变化

Magical Record - 使用 2 个模型 Coredata 或更多