我有一个Core Data对象,其属性“已完成”,并且还有一个重置此值的时间:
@property (nonatomic) BOOL completed;
@property (nonatomic, retain) NSDate * next_reset;
我使用NSFetchedResultsController获取这些对象,对“completed”键进行排序:
NSSortDescriptor *sortDescriptor1 = [[NSSortDescriptor alloc] initWithKey:@"completed" ascending:YES];
NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor1,nil];
皱纹:我在fetch上重置“completed”:
- (void)awakeFromFetch
{
[super awakeFromFetch];
if (!self.auto_reset || !self.completed)
{
return;
}
NSDate *now = [NSDate dateWithTimeIntervalSinceNow:0];
if ([now compare:self.next_reset] == NSOrderedDescending)
{
self.last_reset = now;
self.completed = NO;
}
}
我的问题是这个修改没有反映在获取结果的排序中 - 我将完成的项目与未完成的项目混合在一起。当我完成“实时”项目时,排序会按照我的预期更新。
根据文档,在awakeFromFetch中,Core Data不会监视对对象所做的更改。我确实看到了[self.managedObjectContext save:nil];不保存我在此处所做的更改。我在修改“已完成”之前尝试调用-willChangeValueForKey / -didChangeValueForKey,但这并没有改变。
我在哪里可以对对象进行这些类型的更新,以便Core Data正确地看到它们?显然我不想在任何地方做这个模型(当然不是在我的控制器中获取这些对象!)但是我没有看到任何其他地方来放置这个更新代码。
我至少可以通过这段代码来解决这个问题:
NSDate *now = [NSDate dateWithTimeIntervalSinceNow:0];
NSTimeInterval interval_to_next_reset = [self.next_reset timeIntervalSinceDate:now];
if (interval_to_next_reset < 0.01)
{
interval_to_next_reset = 0.01;
}
[self performSelector:@selector(resetCompleted) withObject:nil afterDelay:interval_to_next_reset];
}
- (void)resetCompleted
{
self.last_reset = [NSDate dateWithTimeIntervalSinceNow:0];
self.completed = NO;
}
但是这会导致表格视图在显示后立即明显重新排列,这是不理想的。
答案 0 :(得分:0)
我最终没有这样解决这个问题。
我没有在-awakeFromFetch
中编写此代码(这显然不是以这种方式使用),而是在我的app委托-didBecomeActive
(和朋友)中添加了代码来调用类方法{ {1}}一次更新所有这些内容。该更新 反映在表格视图中。