OSX プロジェクトのデータ モデルにいくつかの単純なフェッチ リクエスト テンプレートが保存されています。(OSx10.9 + Xcode 5.0.2)
ボタンを作成して FR テンプレートを個別にトリガーすると、正常に機能します。すべてのフェッチ リクエスト テンプレートのディクショナリを取得し、すべてのキー名をコンボ ボックスに追加してから、combo.stringValue を model.fetchRequestTemplateForName と共に使用すると、最初のものだけが機能します。
FR テンプレート名を持つ適切な文字列オブジェクトが fetchRequestTemplateForName に供給されていることを確認する NSLog() ステートメントがあります。
例 - FR テンプレート名にリテラル文字列を指定すると、これらはすべて正常に機能します。
- (IBAction)btnTest:(id)sender {
// get a saved fetch request template from the managed object model
/* // WORKS FINE
NSFetchRequest * fetchRequest =
[self.managedObjectModel
fetchRequestTemplateForName:@"all_cars_under_15000"];
*/
/* // WORKS FINE
NSFetchRequest * fetchRequest =
[self.managedObjectModel
fetchRequestTemplateForName:@"audi_under_20000"];
*/
/* // WORKS FINE
NSFetchRequest * fetchRequest =
[self.managedObjectModel
fetchRequestTemplateForName:@"all_white_cars"];
*/
// WORKS FINE
NSFetchRequest * fetchRequest =
[self.managedObjectModel
fetchRequestTemplateForName:@"all_ford_cars"];
NSError * error = nil;
NSArray * resultsArray =
[self.managedObjectContext
executeFetchRequest:fetchRequest error:&error];
// initialize and open the results window:
if (resultsArray) {
RW =
[[ResultsWindow alloc]
initWithWindowNibName:@"ResultsWindow"];
RW.resultsArray = resultsArray;
[RW showWindow:nil];
}
}
問題コード:
これらのテンプレート名をコンボ ボックスに追加し、コンボ ボックスを使用してフェッチ要求をトリガーして処理すると、FR テンプレートの 1 つだけが機能し、他のテンプレートは fetchRequest = nil で爆発します。
例:
-(void) awakeFromNib {
NSDictionary * frDict =
[self.managedObjectModel fetchRequestTemplatesByName];
NSArray * allKeys = frDict.allKeys;
for (int i = 0; i < allKeys.count; i++){
[self.cmbFetchRequests addItemWithObjectValue: allKeys[i]];
}
}
// self.cmbFetchRequests now has all stored FR templates
- (IBAction)cmbChangedStoredFetchRequest:(id)sender {
NSLog(@"%@", self.cmbFetchRequests.stringValue);
NSFetchRequest * fetch =
[self.managedObjectModel
fetchRequestTemplateForName:self.cmbFetchRequests.stringValue];
/* tried this too:
NSFetchRequest * fetch =
[[self.managedObjectModel
fetchRequestTemplateForName:self.cmbFetchRequests.stringValue] copy];
*/
if (fetch) {
// Create a new error object pointer:
NSError * error = nil;
// execute the fetch and deliver results to an array:
NSArray * resultsArray =
[self.managedObjectContext
executeFetchRequest:fetch error:&error];
// initialize and open the results window:
if (resultsArray) {
RW =
[[ResultsWindow alloc]
initWithWindowNibName:@"ResultsWindow"];
RW.resultsArray = resultsArray;
[RW showWindow:nil];
}
} else {
NSLog(@"fetchRequest = nil !");
}
}