0

创建 NSFetchedResultsController 对象时出现以下错误

编辑

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
// Edit the entity name as appropriate.
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Subscriptions" inManagedObjectContext:self.managedObjectContext];
[fetchRequest setEntity:entity];

// Set the batch size to a suitable number.
[fetchRequest setFetchBatchSize:20];

编辑结束

NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:self.managedObjectContext sectionNameKeyPath:nil cacheName:nil];


#0  0x977109c6 in __pthread_kill ()
#1  0x96296f78 in pthread_kill ()
#2  0x96287bdd in abort ()
#3  0x0022eb71 in uncaught_exception_handler ()
#4  0x024b70fc in __handleUncaughtException ()
#5  0x0264af0f in _objc_terminate ()
#6  0x052fb8de in safe_handler_caller ()
#7  0x052fb946 in std::terminate ()
#8  0x052fcab2 in __cxa_throw ()
#9  0x0264ade1 in objc_exception_throw ()
#10 0x00617f39 in -[NSFetchedResultsController initWithFetchRequest:managedObjectContext:sectionNameKeyPath:cacheName:] ()

我应该开始寻找问题的任何想法。这个错误没有任何帮助。

我已经放了一个断点并且已经检查了输入 init 函数有两个输入,一个是托管对象,第二个是获取请求。

与下面的答案中提到的不同,这两个对象都是有效的。

** 解决方案 ** 看来排序描述符是强制性的,多亏了 Rog

4

1 回答 1

3

实际上,这是一个非常有用的错误。如果你打算在 Objective-C 中编程,你需要习惯于阅读那些堆栈跟踪。

它说你给了 initWithFetchRequest 一些不好吃的东西。事实上,它太糟糕了,它抛出了一个异常。此外,我们知道您没有异常处理程序,因为调用了 std::terminate,最终程序中止。

您可以@catch 异常并自己处理以查看问题,或者,更好的是,放置一个断点来捕获所有异常(这是一个很好的建议,因为在 Objective-c 中,异常实际上是异常的)。

单击断点窗格(在左侧,带有右箭头图标)。在底部是一个小+。点击它。选择“添加异常断点”并让它在所有异常被抛出时中断。

现在,您可以查看实际的异常,它会为您提供指导。最有可能的是,它会告诉您获取请求配置不正确。也可能是你给它喂了一个糟糕的 MOC 或其他参数。

于 2012-08-14T19:52:55.510 回答