0

私は問題に直面し、それを解決することができましたが、正確には何が原因だったのか知りたいです。

従業員の休暇/休暇情報を提供する共有クラスがあります。オブジェクトをフェッチするための休暇情報を提供するユーティリティ クラスにフェッチ リクエストがあります。

コードのこの部分は、リーフをフェッチする役割を果たします。

#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 にデリゲートを設定していないことだけです。しかし、変更を聞くことに興味がないので、必要ありません。むしろ、休暇/休暇情報は、他のモジュールから要求されたときに準備ができている必要があります。

デリゲートがある場合にのみ、変更について FRC に通知するように、coredata の内部が何らかの形で設計されていますか? FRC で -fetchedObjects 呼び出しをトリガーするタイミングに関係なく、どれが失敗した場合でも、古い結果セットが返されるでしょうか?

ありがとう、ラージ

4

1 に答える 1

1

FRC のデリゲートを設定せず、少なくとも 1 つの FRC デリゲート関数 (例: controllerDidChangeContent:) を実装すると、FRC は「追跡なしモード」で実行されます。

つまり、fetchedObjects常に最初のperformFetch:操作の結果セットが返されます。

NSFetchedResultsController(ドキュメントの「概要」セクションを参照してください)。

于 2012-12-31T11:06:28.713 に答える