私は問題に直面し、それを解決することができましたが、正確には何が原因だったのか知りたいです。
従業員の休暇/休暇情報を提供する共有クラスがあります。オブジェクトをフェッチするための休暇情報を提供するユーティリティ クラスにフェッチ リクエストがあります。
コードのこの部分は、リーフをフェッチする役割を果たします。
#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 呼び出しをトリガーするタイミングに関係なく、どれが失敗した場合でも、古い結果セットが返されるでしょうか?
ありがとう、ラージ