Macos fetchRequestTemplateForName:buggy?
我在OSX项目的数据模型中保存了一些简单的获取请求模板。 (OSx10.9+Xcode 5.0.2) 如果我创建按钮并单独触发FR模板,它们工作正常。如果我获取一个包含所有fetch请求模板的字典,将所有键名添加到组合框中,然后将combo.stringValue与model.fetchRequestTemplateForName一起使用,那么只有第一个有效 我有NSLog()语句确认fetchRequestTemplateForName正在被提供一个具有FR模板名称的正确字符串对象 示例-为FR模板名称提供文字字符串时,所有这些都可以正常工作:Macos fetchRequestTemplateForName:buggy?,macos,core-data,request,fetch,Macos,Core Data,Request,Fetch,我在OSX项目的数据模型中保存了一些简单的获取请求模板。 (OSx10.9+Xcode 5.0.2) 如果我创建按钮并单独触发FR模板,它们工作正常。如果我获取一个包含所有fetch请求模板的字典,将所有键名添加到组合框中,然后将combo.stringValue与model.fetchRequestTemplateForName一起使用,那么只有第一个有效 我有NSLog()语句确认fetchRequestTemplateForName正在被提供一个具有FR模板名称的正确字符串对象 示例-为F
- (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];
}
}
问题代码:
当我将这些模板名称添加到组合框中,然后使用组合框来触发和处理fetch请求时,只有一个FR模板有效,然后其他模板以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 !");
}
}
-(void)从NIB唤醒{
NSDictionary*frDict=
[self.managedObjectModel fetchRequestTemplatesByName];
NSArray*allkey=frDict.allkey;
对于(int i=0;i
看起来应该没问题。我可以尝试在两个位置使用对象值,而不是创建具有对象值的条目,然后使用字符串值来查找请求。也就是说,不要使用self.cmbFetchRequests.stringValue
,而是尝试self.cmbFetchRequests.objectValueOfSelectedItem
。嗨,汤姆,谢谢你的回复。你的建议奏效了,所以我仍然不确定什么是错误,什么不是。这个代码段工作时不会崩溃,也不会出现nil fetch请求对象:我也不确定问题出在哪里,但这一更改意味着UI元素数据不在循环中,您只使用从模型中查找的数据。我必须仔细查看stringValue
,看看它与objectValueOfSelectedItem
有什么不同,才能找出真正的原因。汤姆,我没有试过objectValueOfSelectedItem,但我确实执行了各种类型的强制转换和对象副本,以获得我与fetchRequestTemplateForName一起使用的最终字符串对象。它现在是稳定的,但仍然在我的脑海中蠕动!它可能与谓词的同一类型的怪异联系在一起。您可以解析一些字符串对象并将其传递到谓词字符串中,但不能传递整个谓词!想想看吧