【问题标题】:Failed to turn Objects into Faults (Core Data )无法将对象变成故障(核心数据)
【发布时间】:2013-05-22 12:57:02
【问题描述】:

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

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 的一个属性。

正如苹果文档中所说:

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

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

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

如果 flag 为 YES,则从 来自存储或最后缓存状态的值,然后任何更改 被制造(在当地情况下)被重新应用在那些(现在新 更新)值。 (如果标志为 YES,则将值合并到对象中 总是会成功——在这种情况下,不存在所谓的 “合并冲突”或不可能的合并。)

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>

【问题讨论】:

  • 你能登录self.managedObjectContextself.avatar吗?他们是零吗?
  • @DanShelly if (![self.avatar isFault]) 这里告诉self.avatar不是Fault,我稍后会记录它们:)
  • 这并不意味着它不为零。试试[nil isFault]你会得到NO
  • @DanShelly 我已经更新了帖子,请检查。

标签: iphone ios core-data fault


【解决方案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 ...

【讨论】:

  • 您是否在某处实现了消息转发或valueForUndefinedKey
  • 好像没有。我的意思是没有例外 [self.managedObjectContext refreshObject:self.avatar mergeChanges:NO];
  • 你应该得到[self.avatar isFault]的例外
猜你喜欢
  • 2012-10-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-16
  • 2023-04-08
  • 2012-09-07
  • 2010-12-22
相关资源
最近更新 更多