修改awakeFromFetch中的排序键不会更新排序顺序

时间:2014-02-08 05:07:27

标签: ios objective-c sorting core-data

我有一个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;
}

但是这会导致表格视图在显示后立即明显重新排列,这是不理想的。

1 个答案:

答案 0 :(得分:0)

我最终没有这样解决这个问题。

我没有在-awakeFromFetch中编写此代码(这显然不是以这种方式使用),而是在我的app委托-didBecomeActive(和朋友)中添加了代码来调用类方法{ {1}}一次更新所有这些内容。该更新 反映在表格视图中。