我试图使用以下代码将对象转换为Faults,但失败了。
User.m
@implementation User
...
-(void)memoryWarningHandle{
if (![self.avatar isFault]) {
[self.managedObjectContext refreshObject:self.avatar mergeChanges:NO];
if ([self.avatar isFault]) {
NSLog(@"isFault");
// Never went into here
}
}
}
...
此处User
是实体,avatar
是User
的属性。
正如Apple文件中所述:
refreshObject:mergeChanges:更新a的持久属性 托管对象使用持久性存储中的最新值。
- (void)refreshObject:(NSManagedObject *)object mergeChanges:(BOOL)flag参数object一个托管对象。国旗A. 布尔值。
如果flag为NO,则对象变为故障并且任何未决 变化丢失了。在访问对象之前,该对象仍然是错误的 再一次,它的属性值将从中重新加载 存储或上次缓存状态。
如果flag为YES,则从对象的属性值重新加载 来自商店或最后一个缓存状态的值,然后是任何更改 制作(在当地情况下)重新应用于那些(现在新的 更新)值。 (如果flag为YES,则将值合并到object中 将永远成功 - 在这种情况下,因此没有这样的事情 “合并冲突”或不可能的合并。)
调用avatar
后[self.managedObjectContext refreshObject:self.avatar mergeChanges:NO];
必定是错误的,但事实并非如此。这里发生了什么?任何帮助将不胜感激!
编辑1 我测试代码如下:
-(void)memoryWarningHandle{
self.avatar = [UIImage imageNamed:@"avatar.png"];
NSLog(@"self.avatar :%@",self.avatar);
NSLog(@"self.managedObjectContext :%@",self.managedObjectContext);
if (![self.avatar isFault]) {
[self.managedObjectContext refreshObject:self.avatar mergeChanges:NO];
if ([self.avatar isFault]) {
NSLog(@"isFault");
// Never went into here
}
}
}
NSLog结果:
2013-05-23 11:58:30.072 myApp[10967:907] self.avatar :<UIImage: 0x1d5f6e20>
2013-05-23 11:58:30.947 myApp[10967:907] self.managedObjectContext :<NSManagedObjectContext: 0x1e898c10>
答案 0 :(得分:1)
UIImage
不是您无法刷新的NSManagedObject
的子类,也不会响应isFault
。
在任何情况下,您都不能对NSManagedObject
上的特定属性进行错误处理,您必须对整个对象进行错误处理。
尝试[[self managedObjectContext] refreshObject:self mergeChanges:NO]
来判断整个对象。
如果您只想对图片数据进行故障,请将一对一关系(比如imageContainer
)添加到将图像数据保存在属性中的实体(比如imageData
),然后刷新对象的关系如此:
[[self managedObjectContext] refreshObject:self.imageContainer mergeChanges:NO]
您的代码应该有例外:Unrecognized selector sent to instance ...