iOS4 上的 NSFetchedResultsController 问题
Posted
技术标签:
【中文标题】iOS4 上的 NSFetchedResultsController 问题【英文标题】:NSFetchedResultsController issue on iOS4 【发布时间】:2012-02-29 11:16:38 【问题描述】:我正在开发一个使用 CoreData 的应用程序。该视图包含一个使用 NSFetchedResultsController 的 UITableView(包含大约 50 个元素)。还有一个“Pull to refresh”允许在 WS 调用之后刷新存储的数据(在具有新托管对象上下文的另一个线程中)。
在 ios5 上一切正常:当我执行“拉动刷新”时,数据库和 tableview 被刷新。但是iOS4存在问题。第一个“performFetch”在应用程序启动时起作用(tableview 包含所有数据库记录),但是当我执行“Pull to refresh”时出现以下错误:
2012-02-29 11:56:09.119 Nanopost[1996:207] *** Terminating app due to uncaught exception 'NSObjectInaccessibleException', reason: 'CoreData could not fulfill a fault for '0x5c3c760 <x-coredata://E176B0A1-275B-4332-9231-49FD88238C2B/Ads/p231>''
*** Call stack at first throw:
(
0 CoreFoundation 0x02bfe919 __exceptionPreprocess + 185
1 libobjc.A.dylib 0x02e595de objc_exception_throw + 47
2 CoreData 0x028b833f _PFFaultHandlerLookupRow + 1407
3 CoreData 0x028b5ee3 _PF_FulfillDeferredFault + 499
4 CoreData 0x028b9f3f _sharedIMPL_pvfk_core + 95
5 CoreData 0x0292a010 _PF_Handler_Public_GetProperty + 160
6 Foundation 0x02442c4f -[NSSortDescriptor compareObject:toObject:] + 128
7 CoreData 0x0297db5e +[NSFetchedResultsController(PrivateMethods) _insertIndexForObject:inArray:lowIdx:highIdx:sortDescriptors:] + 286
8 CoreData 0x0297e1b2 -[NSFetchedResultsController(PrivateMethods) _postprocessInsertedObjects:] + 402
9 CoreData 0x029841bc -[NSFetchedResultsController(PrivateMethods) _managedObjectContextDidChange:] + 1804
10 Foundation 0x02380c1d _nsnote_callback + 145
11 CoreFoundation 0x02bd6cf9 __CFXNotificationPost_old + 745
12 CoreFoundation 0x02b5611a _CFXNotificationPostNotification + 186
13 Foundation 0x023767c2 -[NSNotificationCenter postNotificationName:object:userInfo:] + 134
14 CoreData 0x028c0519 -[NSManagedObjectContext(_NSInternalNotificationHandling) _postObjectsDidChangeNotificationWithUserInfo:] + 89
15 CoreData 0x028f802b -[NSManagedObjectContext mergeChangesFromContextDidSaveNotification:] + 1579
16 Foundation 0x02395e9a __NSThreadPerformPerform + 251
17 CoreFoundation 0x02bdfd7f __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ + 15
18 CoreFoundation 0x02b3e2cb __CFRunLoopDoSources0 + 571
19 CoreFoundation 0x02b3d7c6 __CFRunLoopRun + 470
20 CoreFoundation 0x02b3d280 CFRunLoopRunSpecific + 208
21 CoreFoundation 0x02b3d1a1 CFRunLoopRunInMode + 97
22 GraphicsServices 0x031e62c8 GSEventRunModal + 217
23 GraphicsServices 0x031e638d GSEventRun + 115
24 UIKit 0x0063cb58 UIApplicationMain + 1160
25 Nanopost 0x0000230a main + 170
26 Nanopost 0x00002255 start + 53
)
terminate called after throwing an instance of '_NSCoreDataException'
当我初始化“NSFetchRequest”时,我将“FetchBatchSize”设置为 20(随机):
[l_FetchRequest setFetchBatchSize:20];
但如果我将“FetchBatchSize”设置为 25:
[l_FetchRequest setFetchBatchSize:25];
... iOS4 上不再出现崩溃,我不知道为什么,我想了解这个问题 :) 我不认为这条线是真正的问题。也许这表明某处还有另一个问题?
非常感谢您的回答!
托马斯
【问题讨论】:
【参考方案1】:您使用不同的上下文是否有原因?我没有切换我的,我有一个听起来非常相似的应用程序。
你可能会比较的一个东西是这个非常方便的 CoreDataTableViewController:
http://www.stanford.edu/class/cs193p/cgi-bin/drupal/node/289
我使用它并且没有遇到任何问题(尽管我没有在 iOS 4 中运行)。你可以比较一下你是如何连接 fetchedResultsController 的。
还有一点——一旦引发异常,您是否有包罗万象的断点来推送调试器?如果没有,添加它(断点,+ 添加,“添加异常断点”并保持默认值)。这将使您在引发异常的那一行进入调试器,这应该很有用。
祝你好运,
达米安
【讨论】:
您好 Damien,感谢您的回答!我使用不同的上下文,因为根据 Apple 的文档(另一个线程 = 另一个托管对象上下文),这似乎是“最佳实践”。我试图添加一个“异常断点”。不幸的是,异常是在 main.m 文件中引发的,因此很难找到有关此问题的线索。托马斯 main.m 中的异常意味着它没有被处理并展开整个堆栈。您的异常断点将在抛出后立即引发 - 重试直到它工作,关键是要查看程序在中断时的确切位置。以上是关于iOS4 上的 NSFetchedResultsController 问题的主要内容,如果未能解决你的问题,请参考以下文章
animateWithDuration 在升级到 xcode 4.6 后导致 ios4 上的触摸事件出现问题
在 uitableview 中禁用反弹也会禁用 iOS 5 上的滚动,但不会禁用 iOS4
iPhone OS (iOS 4) 上的 Bignum、线性代数和数字信号处理