我有一个单例数据管理器,它有这样的方法:
-(NSArray*)fetchItems
{
NSEntityDescription *entity = [NSEntityDescription
entityForName:@"Item" inManagedObjectContext:self.managedObjectContext];
NSError *error2;
NSFetchRequest *itemFetchRequest = [[NSFetchRequest alloc] init];
[itemFetchRequest setEntity:entity];
[itemFetchRequest setReturnsObjectsAsFaults:NO];
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"order"
ascending:YES];
NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil];
[itemFetchRequest setSortDescriptors:sortDescriptors];
NSArray *fetchedItems = [self.managedObjectContext executeFetchRequest:itemFetchRequest error:&error2];
return fetchedItems;
}
然后,我基于核心数据对象创建了一些视图,如下所示:
self.items = [dataManager fetchItems];
for (Item *item in self.items) { //Item is the NSManagedObject subclass
ItemView *itemView = [[ItemView alloc] initWithFrame:aFrame ];
[itemView layoutWithData:item];
[self.someView addSubview:itemView];
}
ItemView的数据设置如下:
- (void)layoutWithData:(Item*)_data {
self.data = _data;
NSLog(@"ItemView data: %@", self.data); //not "fault" at this point
...
UIButton *btn = [UIButton buttonWithType:UIButtonTypeCustom];
[btn setImage:data.image forState:UIControlStateNormal];
[btn addTarget:self action:@selector(tapDetected:) forControlEvents:UIControlEventTouchUpInside];
btn.frame = aFrame;
[self addSubview:btn];
}
此时,ItemView的数据已定义,并且不是"错误"。然而,当检测到像这样的点击时:
- (void)tapDetected:(id)sender
{
NSLog(@"TAP: %@", self.data); //fault - see below
[self.delegate itemTapped:self.data];
}
我得到这样的东西:
TAP: <Item: 0x879ce40> (entity: Item; id: 0x8798310 <x-coredata://8BE9ABFE-7C63-4ADD-9AD1-62B81C5AFF66/Item/p66> ; data: <fault>)
为什么当我点击ItemView时,数据一开始是"非故障"的,后来是"故障"的?我该如何修复它?这一整天都在折磨我。。。
编辑:使用此代码,我可以确认数据不是layoutWithData方法中的故障,而是tapDetected方法:中的故障
NSLog(@"is fault? %i", self.data.isFault);
为什么会变成故障???
这可能不是真正的问题,但这是一个故障,意味着数据尚未读取。尝试在提取之前执行以下操作:
[fetchRequest setReturnsObjectsAsFaults:NO];
这样数据将被完全读取。
请参阅类似问题