核心数据二进制数据,允许外部存储崩溃

佐尔特

我在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)

在此处输入图片说明

似乎核心数据具有该图像,但是当它尝试检索它时,它将失败。

在这种情况下,如何验证数据完整性?我想以用户友好的方式处理此故障,而不是使应用程序崩溃。

罗丹

这是由iOS 12.0.x中的Core Data外部存储中的已知错误引起的,如下所述:https ://stackoverflow.com/a/52628198/2347353 没有解决方法,但该错误似乎已在iOS 12.1中修复。

不过,要回答您的问题,请使用一些黑客手段,您可以获取应该存储数据的文件名,并检查其是否存在。如果文件丢失,则说明损坏已发生,因此可以避免读取属性,从而防止应用崩溃。

没有文件记录在案,但是文件似乎以_EXTERNAL_DATA您可以从保存到数据存储中的值算出的文件名存储在应用程序的Documents文件夹隐藏目录中。

此答案显示了如何在Objective-C中执行此操作,并且从以下位置获得了很多详细信息:https : //stackoverflow.com/a/13497992/2347353但是,对于任何在家尝试此操作的人,请注意以下警告,这些警告均基于Apple的Core Data内部实现细节,并且将来可能会停止工作。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章