Jaa*_*nus 3 iphone cocoa-touch core-data fault
码:
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"A"
inManagedObjectContext:moc];
[fetchRequest setEntity:entity];
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"id" ascending:NO];
NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil];
[fetchRequest setSortDescriptors:sortDescriptors];
[sortDescriptors release];
[sortDescriptor release];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"somePredicate", someObject];
[fetchRequest setPredicate:predicate];
frc = [[NSFetchedResultsController alloc]
initWithFetchRequest:fetchRequest
managedObjectContext:moc
sectionNameKeyPath:@"recency"
cacheName:@"frc"];
[fetchRequest release];
frc.delegate = self;
NSError *error;
BOOL success = [frc performFetch:&error];
if (!success) {
NSLog(@"error: %@", error);
}
for (A *a in [frc fetchedObjects]) {
[someMutableArray addObject:a.b];
[someMutableArray addObject:a];
}
Run Code Online (Sandbox Code Playgroud)
数据模型:
A和B是实体.A与B.具有强制性的一对一关系.B具有与A的反向可选对多关系.
以上英文:
初始化NSFetchedResultsController以获取一些数据以支持tableview.初始提取后,将数据设置为一些处理.
现在,稍后,我尝试这样做:
id object = [someMutableArray objectAtIndex:someIndex];
NSLog(@"%@", object);
if ([object isMemberOfClass:[B class]]) {
someVar = object.propertyFromB; // problem
} else if ([object isMemberOfClass:[A class]]) {
someVar = object.propertyFromA;
}
Run Code Online (Sandbox Code Playgroud)
问题/问题:表示"问题"的行崩溃了.(编辑:请参阅下面的解决方案,但仍然需要解释.)
上面的NSLog调用产生:
2010-01-30 14:47:14.433 app[22618:20b] <B: 0xf7f750> (entity: B; id: 0xf7ba70 <x-coredata://B01FEC86-14D6-4973-BFDB-EDE4AFD24FDC/B/p4> ; data: <fault>)
2010-01-30 14:47:14.438 app[22618:20b] <A: 0xf7e360> (entity: A; id: 0xf35820 <x-coredata://B01FEC86-14D6-4973-BFDB-EDE4AFD24FDC/A/p6> ; data: {
prop1 = value1;
prop2 = value2;
... etc ...
})
Run Code Online (Sandbox Code Playgroud)
即问题线,如果对象是A类型,它已经出现故障并且在内存中可用,但如果是B,那就是故障.
我的理解是"问题"行应该触发故障并从存储中获取数据,但这不会发生.我想了解/调试原因.我试过在这周围插入willAccessKey/didAccessKey调用.我还尝试在获取请求上设置setRelationshipKeyPathsForPrefetching:"b".都没有奏效.
我的假设是,由于我有点滥用NSFetchedRequestController结果,故障引擎在此过程中一直混淆并且在它应该的时候没有获取错误.所以我想一种强力方法是创建一个新的手动提取请求,以便在适当的时间获取相关的B对象.但有更好的方法吗?
编辑:
问题是对象B有一个我已经定义的属性"描述",但是它与NSObject的内置名称相冲突.Xcode总是给我警告,但我忽略了它们因为我认为"description"内部属性/方法仅用于将字符串转储到控制台之类,而不是内部处理.
我制作新版本的模型后,问题就消失了,将"描述"重命名为其他内容.所有断层开始按预期工作.
但我不明白发生了什么.核心数据是否使用对象的"描述"方法进行内部自省?
来自核心数据编程指南
不鼓励覆盖描述 - 如果此方法在调试操作期间触发错误,结果可能是不可预测的 - 并且initWithEntity:insertIntoManagedObjectContext:.您通常不应该覆盖键值编码方法,例如valueForKey:和setValue:forKeyPath:.
-description是NSObject中的一个方法,它返回对象的字符串表示形式.在该行中NSLog(@"%@", object),-description用于获取您在控制台中看到的字符串.键值编码最终将使用该方法获取描述属性的属性.这导致核心数据的混乱.
当节目"气馁"时,节目指南很慷慨.他们的意思是"是的,它会破坏你的东西."
该链接还有一个很好的其他方法列表,如果你覆盖它们将破坏你的东西.
| 归档时间: |
|
| 查看次数: |
1691 次 |
| 最近记录: |