更改的属性未与 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 一起使用时构建测试时出错