NSFetchedResultsController兼容性问题
熟悉 CoreData
的都知道 NSFetchedResultsController
这个类,与 tableView
和 collectionView
结合起来使用非常方便。
但是这个类在 iOS10
中有个比较坑爹的地方,如果使用的是下图的方式初始化
并且传入的 cacheName
不为 nil
,那么在 iOS10
下面可能会产生各种莫名其妙的崩溃。详细原因如下图描述:
简单翻译一下就是:修改了 vc
的 fetchRequest
之后,context
的 save
操作会打开一个或多个文件描述符,当打开的文件描述符数目超过255
(真机)后,后续的资源加载都会导致崩溃。
当初遇到这个问题的时候,整个应用都处于随机崩溃的情况,看日志都是加载 storyboard
或者 xib
等资源时的崩溃,但是死活复现不出来,看崩溃日志也找不到原因。然后无意间发现 Xcode console
中一直不断输出如下警告信息:
(NSFetchedResultsController): couldn't read cache file to update store info timestamps
然后 google 了一下,找到了一个相同的问题,并且有完整的复现 Demo
及复现步骤,然后全局代码搜索果然发现有一个地方初始化的时候传入了 cacheName
,将其置 nil
后就再也没有那段 warning
同时上线之后也没有再收到资源加载的崩溃了。
所以 Xcode
的 warning
还是值的注意的。附上这个 radar
的链接,里面包含 Demo
地址。
今天再去复现的时候,试了两台 iOS10
的设备,Xcode 9.1
下 iPhone5S iOS10.2
这个 bug 已经不存在了,但是 iPhone7 iOS10.0
还是存在的。