如何修复“NSObjectInaccessibleException”获取请求在被 NSManagedObjectContext 使用之前无法响应 -entity
Posted
技术标签:
【中文标题】如何修复“NSObjectInaccessibleException”获取请求在被 NSManagedObjectContext 使用之前无法响应 -entity【英文标题】:How to fix ‘NSObjectInaccessibleException’ fetch request cannot respond to -entity until used by an NSManagedObjectContext' 【发布时间】:2012-11-08 07:48:05 【问题描述】:代码在 ios5+ 中运行良好:
NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"FooBar"];
request.sortDescriptors = [NSArray arrayWithObject:[NSSortDescriptor sortDescriptorWithKey:@"ident"
ascending:NO
selector:@selector(compare:)]];
request.predicate = [NSPredicate predicateWithFormat:@"xxx = %@", @"yyy"];
self.fetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:request
managedObjectContext:model.managedObjectContext
sectionNameKeyPath:nil
cacheName:nil];
但在 iOS 4 中,出现以下错误:
'NSObjectInaccessibleException', reason: 'This fetch request (0x70d4700)
was created with a string name (FooBar), and cannot respond to -entity
until used by an NSManagedObjectContext'
2012-11-08 12:12:18.093 hello[1566:11d03] *** Terminating app due to uncaught
exception 'NSObjectInaccessibleException', reason: 'This fetch request
(0x70d4700) was created with a string name (FooBar), and cannot respond
to -entity until used by an NSManagedObjectContext'
*** Call stack at first throw:
(
0 CoreFoundation 0x012405a9 __exceptionPreprocess + 185
1 libobjc.A.dylib 0x0104a313 objc_exception_throw + 44
2 CoreData 0x000be68f -[NSFetchRequest entity] + 159
3 CoreData 0x0019f7fb -[NSFetchedResultsController initWithFetchRequest:managedObjectContext:sectionNameKeyPath:cacheName:] + 763
...
我该如何解决这个错误?
【问题讨论】:
【参考方案1】:fetchRequestWithEntityName:
仅适用于 iOS 5 及更高版本。
在 iOS 4 上,您必须先创建一个 NSEntityDescription
:
NSEntityDescription *fooBarEntity = [NSEntityDescription entityForName:@"FooBar" inManagedObjectContext:model.managedObjectContext];
NSFetchRequest *request = [[NSFetchRequest alloc] init];
[request setEntity:fooBarEntity];
【讨论】:
有趣的是,在 iOS 4 中调用fetchRequestWithEntityName:
不会导致应用崩溃
@freestyler:是的。 - 我假设该方法已经存在于 iOS 4 中,但不像在 iOS 5 中那样工作。头文件中的 NS_AVAILABLE
宏还声称它在 iOS 4 中可用,正如 Dominik 在他的回答中注意到的那样。 - 但是文档明确指出它在 iOS 5 中可用。【参考方案2】:
问题是 NSFetchRequest 没有上下文来获取对象......你总是需要一个特定的上下文来获取 entityDescription 。在 ios5 中,entityDescription 的获取被很好地隐藏并延迟到您执行 fetch :) 因为它不是
标题是错误的顺便说一句。它说它对 ios4 有好处:
+ (NSFetchRequest*)fetchRequestWithEntityName:(NSString*)entityName NS_AVAILABLE(10_7, 4_0);
Id 提交一个错误。不管怎样@Martin R 是正确的 :)
【讨论】:
以上是关于如何修复“NSObjectInaccessibleException”获取请求在被 NSManagedObjectContext 使用之前无法响应 -entity的主要内容,如果未能解决你的问题,请参考以下文章