stackoverflow.com/questions/48699000/...
ню цвета в своем двоичном хранилище базовых данных, используя трансформируемый атрибут, определяя класс атрибута как UIColor следующим образом:
#import "CoreDataEntity+CoreDataClass.h"
#import <UIKit/UIKit.h>
NS_ASSUME_NONNULL_BEGIN
@interface CoreDataEntity (CoreDataProperties)
+ (NSFetchRequest<CoreDataEntity *> *)fetchRequest;
@property (nullable, nonatomic, retain) UIColor *transformable;
@property (nullable, nonatomic, copy) NSString *string;
@end
NS_ASSUME_NONNULL_END
В iOS 11 Beta это перестало работать с такой ошибкой:
NSUnderlyingException=value for key 'NS.objects' was of unexpected class 'UIColor'. Allowed classes are '{(\n NSDecimalNumber,\n NSData,\n NSUUID,\n NSNumber,\n NSDate,\n NSArray,\n NSOrderedSet,\n NSDictionaryMapNode,\n NSString,\n NSSet,\n NSDictionary,\n NSURL,\n NSNull\n)}'.}";
NSUnderlyingException = "Can't read binary data from file";
}
Мне удалось воспроизвести конкретную проблему в проекте XCode на GitHub (Должен быть запущен с XCode Beta дважды, чтобы получить ошибку).
В демонстрационном проекте тип хранилища контролируется NSPersistentStoreDescription и задает для него значение NSBinaryStoreType, что я делаю в AppDelegate в проекте exanple, и я добавляю объекты в приложение didFinishLaunchingWithOptions, в противном случае это стандартный шаблон из приложения iOS11 с основными данными. Плюс небольшая датаамодель и занятия.
Если вы запускаете проект дважды, то в первый раз он создает хранилище данных, и все в порядке. Во второй раз хранилище данных пытается открыть и вылетает приложение. Эта проблема, кажется, связана только с бинарными хранилищами данных, насколько я могу судить, если я использую хранилище данных с поддержкой SQL, оно работает. Тем не менее, мое приложение в дикой природе и использует двоичный файл.
Я сообщил об этом Apple как об ошибке и обратился за помощью на форумы разработчиков, но Apple не признала эту ошибку, и никакой помощи не последовало.
Я немного волнуюсь, поскольку приближается дата выхода iOS11, и у меня нет решения, мое приложение просто не будет работать в iOS11.
Я попытался изменить свойство на NSData и посмотреть, возможно ли просто разархивировать данные, но кажется, что они как-то хранятся внутри как UIColor, и база данных просто не открывается.
Кто-нибудь может увидеть обходной путь? У меня есть приложение в дикой природе, и, возможно, я выпускаю обновление для преобразования хранилищ данных, прежде чем iOS11 сможет работать для некоторых, но это не гарантирует, что все пользователи получат исправления, и они могут потерять свои данные.
РЕДАКТИРОВАТЬ 1: Радар номер: 33895450
РЕДАКТИРОВАТЬ 2: Просто мне пришло в голову, что это относится кЛюбые трансформируемый атрибут в основных данных, значения, поддерживаемые в сообщении об ошибке, являются только типами свойств по умолчанию.
РЕДАКТИРОВАТЬ 3: просто из любопытства я заполнил все поля для трансформируемого атрибута (это никогда не требовалось раньше). Я добавил «NSKeyedUnarchiveFromData» к значению преобразователя имени основного объекта данных, оно должно быть по умолчанию, но вы никогда не знаете. Нет эффекта. В любом случае, он должен использовать преобразователь значения, чтобы знать, что это UIColor. Я заполнил поле пользовательского класса, чтобы оно было UIColor, без эффекта.
Редактировать 5: Я заметил ранее, что UIColor теперь поддерживает NSSecureCoding, если безопасность каким-то образом будет проблемой, которую так или иначе упускают из виду в другом типе хранилища.
Изменить: Теперь, когда iOS выпущена, я использовал один из моих TSI для дальнейшего наращивания этого. Получу ли я их обратно, если мне придется использовать один, чтобы заставить их исправить свое программное обеспечение?
Изменить: Apple ответил мне на мой TSI, они сказали, что это расследуется, нет обходного пути, и ждать ошибки. Они возместили мой TSI, потому что они не могли помочь.
Редактировать 8: Та же проблема в macOS High Sierra, с NSColor вместо UIColor.
Apple до сих пор не дал мне никакого отзыва о моем фактическом отчете об ошибке.