无法将对象变为故障(核心数据)

时间:2013-05-22 12:57:02

标签: iphone ios core-data fault

我试图使用以下代码将对象转换为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是实体,avatarUser的属性。

正如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>

1 个答案:

答案 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 ...