2014-02-08 75 views
1

我有了“已完成”的属性,也是一个时间重置该值的核心数据对象:修改排序键不会更新排序顺序

@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; 
} 

,但是这会导致表视图明显自行重组正在显示后,这是不理想的。

回答

0

我最终通过不这样做来解决这个问题。

而不是写在-awakeFromFetch这个代码(这显然并不意味着使用这种方式),我在我的应用程序委托的-didBecomeActive(&朋友)添加的代码调用类方法+processQuestsNeedingReset这将更新所有这些一次性的。该更新是反映在表视图中的

+0

这是一个古老的问题,但我遇到了与在iOS 10.x上运行的Objective-C应用程序相同的问题。在调用awakeFromFetch之前返回提取结果。我也通过为我的逻辑流使用非综合属性来解决这个问题。有没有其他人看过这个?这是否与新的iOS版本有关?有没有修复?谢谢! –