我有了“已完成”的属性,也是一个时间重置该值的核心数据对象:修改排序键不会更新排序顺序
@property (nonatomic) BOOL completed;
@property (nonatomic, retain) NSDate * next_reset;
我取一个NSFetchedResultsController这些对象,在 “完成” 键排序:
NSSortDescriptor *sortDescriptor1 = [[NSSortDescriptor alloc] initWithKey:@"completed" ascending:YES];
NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor1,nil];
皱纹:我重置 “完成” 上获取:
- (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保存:无];不保存我在此处所做的更改。在修改“完成”之前,我尝试调用-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;
}
,但是这会导致表视图明显自行重组正在显示后,这是不理想的。
这是一个古老的问题,但我遇到了与在iOS 10.x上运行的Objective-C应用程序相同的问题。在调用awakeFromFetch之前返回提取结果。我也通过为我的逻辑流使用非综合属性来解决这个问题。有没有其他人看过这个?这是否与新的iOS版本有关?有没有修复?谢谢! –