我在iOS 12.0.1上的以下日志崩溃了:
ImageIO: CFDataGetBytes: data: 0x28539b2f0 size: 154262 offset: 8 count: 8 dst: 0x16dbf86f0
External data reference cant find underlying file.
Fatal Exception: NSInternalInconsistencyException
0 CoreFoundation 0x23c2d7ef8 __exceptionPreprocess
1 libobjc.A.dylib 0x23b4a5a40 objc_exception_throw
2 CoreData 0x23efd5fc8 -[_PFExternalReferenceData getBytes:range:]
3 ImageIO 0x23e6c7178 IIOImageRead::getCFDataBytesAtOffset(void*, unsigned long, unsigned long)
4 ImageIO 0x23e6c6c38 IIOImageRead::getBytesAtOffset(void*, unsigned long, unsigned long)
5 ImageIO 0x23e711aa4 IIO_Reader_PNG::getImageCount(IIOImageReadSession*, IIODictionary*, int*, unsigned int*)
6 ImageIO 0x23e54c5d8 IIO_Reader::callGetImageCount(CGImageReadSession*, IIODictionary*, int*)
7 ImageIO 0x23e532194 IIOImageSource::updatedCount()
8 ImageIO 0x23e5367b4 CGImageSourceGetCount
9 UIKitCore 0x26960c1a4 _UIImageRefFromData
10 UIKitCore 0x268d4e15c -[UIImage(UIImagePrivate) _initWithData:preserveScale:cache:]
11 UIKitCore 0x268d48b7c +[UIImage imageWithData:]
12 MyApp 0x102239570 __48-[InfoPreviewController bindToPatient:]_block_invoke_2 (InfoPreviewController.m:83)
13 ReactiveObjC 0x1031f8004 -[RACSubscriber sendNext:] (RACSubscriber.m:72)
似乎核心数据具有图像,但是当它尝试检索它时,它将失败。
在这种情况下如何验证数据完整性? 我想以一种用户友好的方式处理此故障,而不是使应用程序崩溃。
答案 0 :(得分:0)
这是由iOS 12.0.x中的Core Data外部存储中的一个已知错误引起的,如下所述:https://stackoverflow.com/a/52628198/2347353。没有解决方法,但该错误似乎已在iOS 12.1中修复。
不过,要想回答您的问题,请使用一些骇客的技巧,获取要存储数据的文件名,并检查其是否存在。如果文件丢失,则说明损坏已发生,因此可以避免读取属性,从而防止应用崩溃。
这些都没有记录,但是文件似乎存储在应用程序“文档”文件夹中的_EXTERNAL_DATA
隐藏目录中,文件名可以从保存到数据存储区的值中计算出来。
此答案显示了如何在Objective-C中执行此操作,并且在这里我从https://stackoverflow.com/a/13497992/2347353中获得了很多详细信息。但是对于任何在家尝试此操作的人,请注意以下警告,这些警告均基于Apple的Core Data内部实现详细信息,并且有可能在将来的任何时候停止工作。
答案 1 :(得分:0)
由于无法访问外部存储文件夹而导致崩溃。
因此,在使用extractCSS:true
访问对象值之前,请确保您有权访问或访问存储Core Data SQLite数据库文件的文件夹。