使用NSFetchedResultsController直接获取NSManagedObjectContext

时间:2012-12-31 10:40:50

标签: iphone cocoa-touch core-data nsfetchedresultscontroller nsmanagedobjectcontext

我遇到了一个问题,可以解决它,但我很想知道究竟是什么原因。

我有一个共享课程,应该给我一个员工的假期/假期信息。我在我的实用程序类中有一个获取请求,它提供了获取对象的休假信息。

这部分代码负责获取叶子:

#define FETCH_DIRECTLY 1
-(NSArray*)targetHoursArrayOnDate:(NSDate*)inDate
{
#if FETCH_DIRECTLY
    NSFetchRequest *targetHoursFR = [CSUtilities fetchRequestForVacationOrLeave];
    CSAppDelegate *appDelegate = [[UIApplication sharedApplication] delegate];
    NSArray *arrayOfTargetHours = [[appDelegate managedObjectContext] executeFetchRequest:targetHoursFR
                                                      error:NULL];
#else
    NSArray *arrayOfTargetHours = [self.targetHoursFRC fetchedObjects];
#endif
    NSPredicate *checkDatePredicate = [NSPredicate predicateWithBlock:^BOOL(id evaluatedObject, NSDictionary *bindings)
                                       {
                                           BOOL dateExists = NO;
                                           if ([evaluatedObject isKindOfClass:[CSTargetHours class]])
                                           {
                                               CSTargetHours *aTargetHour = (CSTargetHours*)evaluatedObject;
                                               if ([aTargetHour.leaveDate isEqualToDate:inDate])
                                                   dateExists = YES;
                                           }
                                           return dateExists;
                                       }];

    NSArray *targetHoursOnQueriedDate = [arrayOfTargetHours filteredArrayUsingPredicate:checkDatePredicate];
    if (0==[targetHoursOnQueriedDate count])
        targetHoursOnQueriedDate = nil;
    return targetHoursOnQueriedDate;
}

请注意,FETCH_DIRECTLY是我怀疑的情况。如果我使用FRC来获取叶子,它就会失败。然而,如果我直接使用App委托的managedObjectContext,它会成功获取对象!这令我感到困惑。

创建FRC的方法是:

@synthesize targetHoursFRC = targetHoursFRC_;
-(NSFetchedResultsController*)targetHoursFRC
{
    if (nil==targetHoursFRC_)
    {
        NSFetchRequest *targetHoursFR = [CSUtilities fetchRequestForVacationOrLeave];
        CSAppDelegate *appDelegate = [[UIApplication sharedApplication] delegate];
        targetHoursFRC_ = [[NSFetchedResultsController alloc] initWithFetchRequest:targetHoursFR
                                                              managedObjectContext:appDelegate.managedObjectContext
                                                                sectionNameKeyPath:nil
                                                                         cacheName:nil];
    }
    return targetHoursFRC_;
}

- (id)init
{
    self = [super init];
    if (self) {
        [self.targetHoursFRC performFetch:NULL];
    }
    return self;
}

我唯一遗漏的是,我没有将代表委托给FRC。但我不需要它,因为我对收听变化不感兴趣。相反,当从其他模块询问时,叶子/度假信息应该准备就绪。

coredata的内部结构是否设计为只有在有任何代表时才通知FRC有关更改?如果失败了,无论何时我们在FRC上触发-fetchedObjects调用,它都会给出一些旧的结果?

谢谢, 拉吉

1 个答案:

答案 0 :(得分:1)

如果您没有为FRC设置委托,并且至少实现一个FRC委托功能(例如controllerDidChangeContent:),那么FRC将以“无跟踪模式”运行。

这意味着fetchedObjects将始终返回初始performFetch:操作的结果集。

(请参阅NSFetchedResultsController文档中的“概述”部分。)