Основные данные двоичных данных с возможностью внешних сбоев хранилища - PullRequest
0 голосов
/ 14 ноября 2018

У меня сбой со следующим журналом на 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)

enter image description here

Кажется, что у основных данных есть изображение, но когда оно пытается получить его, оно терпит неудачу.

Как я могу проверить целостность данных в этом случае? Я хотел бы обработать этот сбой удобным для пользователя способом, а не сбивать приложение.

1 Ответ

0 голосов
/ 15 ноября 2018

Это вызвано известной ошибкой во внешнем хранилище Core Data в iOS 12.0.x, как обсуждалось здесь: https://stackoverflow.com/a/52628198/2347353. Обходного пути нет, но ошибка, похоже, исправлена ​​в iOS 12.1.

Чтобы ответить на ваш вопрос, хотя, с небольшим количеством хакерских покер, вы можете получить имя файла, в котором хранятся данные предполагается , и проверить, существует ли он или нет.Если файл отсутствует, то вы знаете, что произошло повреждение, поэтому вы можете избежать чтения атрибута и, следовательно, предотвратить сбой приложения.

Ничего из этого не задокументировано, но файлы, похоже, хранятся в_EXTERNAL_DATA скрытый каталог в папке «Документы» вашего приложения с именем файла, которое вы можете определить из значения, которое сохраняется в хранилище данных.

Этот ответ показывает, как это сделать в Objective-C, и вот откуда я получил много подробностей: https://stackoverflow.com/a/13497992/2347353. Но для тех, кто пытается это сделать дома, обращайте внимание на предупреждения, что этоВсе они основаны на деталях внутренней реализации Apple Core Data и могут перестать работать в любой момент в будущем.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...