簡體   English   中英

核心數據二進制數據允許外部存儲崩潰

[英]Core data binary data with allows external storage crashes

我在 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 中修復。

不過,要回答您的問題,通過一些黑客技巧,您可以獲得應該存儲數據的文件名並檢查它是否存在。 如果文件丟失,那么您就知道損壞已經發生,因此您可以避免讀取該屬性,從而防止應用程序崩潰。

這些都沒有記錄在案,但文件似乎存儲在應用程序的 Documents 文件夾中的_EXTERNAL_DATA隱藏目錄中,文件名可以從保存到數據存儲的值中計算出來。

這個答案展示了如何在 Objective-C 中做到這一點,我從這里得到了很多細節: https : //stackoverflow.com/a/13497992/2347353 但是對於在家中嘗試此操作的任何人,請注意警告,這一切都基於 Apple 的 Core Data 內部實現細節,並且可能在未來的任何時候停止工作。

崩潰可能是由於沒有對外部存儲文件夾的文件訪問權限造成的。

因此,在使用attribute.description?.allowsExternalBinaryDataStorage == true訪問對象值之前,請確保您有權訪問或訪問存儲 Core Data SQLite 數據庫文件的文件夾。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM