【发布时间】: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 是一个实体,avatar 是User 的一个属性。
正如苹果文档中所说:
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.managedObjectContext和self.avatar吗?他们是零吗? -
@DanShelly if (![self.avatar isFault]) 这里告诉self.avatar不是Fault,我稍后会记录它们:)
-
这并不意味着它不为零。试试
[nil isFault]你会得到NO -
@DanShelly 我已经更新了帖子,请检查。
标签: iphone ios core-data fault