0

我正在尝试使用以下代码将对象转换为故障,但失败了。

用户.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

正如苹果文档中所说:

refreshObject:mergeChanges:更新托管对象的持久属性以使用持久存储中的最新值。

  • (void)refreshObject:(NSManagedObject *)object mergeChanges:(BOOL)flag 参数 object 一个托管对象。flag 一个布尔值。

如果 flag 为 NO,则对象将变为故障,并且任何未决更改都将丢失。该对象在再次访问之前一直是错误的,此时它的属性值将从存储或上次缓存状态重新加载。

如果 flag 为 YES,则对象的属性值从存储中的值或上次缓存状态中重新加载,然后(在本地上下文中)所做的任何更改都将重新应用于那些(现在新更新的)值。(如果 flag 为 YES,则将值合并到 object 将始终成功 - 在这种情况下,因此不存在“合并冲突”或不可能的合并之类的事情。)

avatarmust be fault after被[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>
4

1 回答 1

1

UIImageis 不是NSManagedObject你不能刷新的子类 is,它也不响应isFault.
在任何情况下,您都不能对 a 上的特定属性进行NSManagedObject故障处理,而必须对整个对象进行故障处理。

尝试[[self managedObjectContext] refreshObject:self mergeChanges:NO]让你的整个对象出错。

如果您只想对图片数据进行故障排除,请将一对一关系(例如imageContainer)添加到在属性中保存图像数据的实体(例如imageData),然后在对象上刷新该关系,如下所示:

[[self managedObjectContext] refreshObject:self.imageContainer mergeChanges:NO]

您的代码中应该有一个异常,例如:Unrecognized selector sent to instance ...

于 2013-05-23T06:07:44.277 回答