Хранение объекта UIColor в Core Data

ios core-data uicolor

8225 просмотра

3 ответа

765 Репутация автора

Я хочу сохранить объект UIColor в качестве атрибута на объекте Core Data, затем извлечь его и использовать его так же, как и другие атрибуты этого объекта.

В моих исследованиях, хотя литература кажется довольно скудной, я нахожу в этом посте сообщение о том, что атрибут должен быть указан как «Преобразуемый», и что данные должны быть вручную преобразованы при использовании NSKeyedArchiverи выходе с использованием NSKeyedUnarchiver.

Но потом я нахожу более позднюю статью, в которой говорится, что все, что нужно, это сохранить UIColor как трансформируемый атрибут на CD, сгенерировать подкласс Managed Object и использовать точно так же, как и другие атрибуты.

Сами документы Apple подробно описывают хранение и извлечение NSColorобъектов, но не (что я мог найти) UIColor. Тем не менее, это звучит так, как будто архивирование / разархивирование обрабатываются автоматически на CD. Может быть. Я был смущен этой строкой:

Если вы используете редактор моделей в Xcode, выберите Transformable во всплывающем окне Type атрибута и введите имя в текстовом поле Value Transformer Name.

Я предполагаю, что они говорят об имени атрибута, но я не уверен, тем более что он предупреждает о потенциальных проблемах, возникающих из-за явного указания преобразователя:

Важное замечание: Хотя преобразователь по умолчанию - это преобразователь, указанный в NSKeyedUnarchiveFromDataTransformerName, этот преобразователь фактически используется в обратном порядке. Если вы укажете преобразователь по умолчанию явно, Core Data будет использовать его «в неправильном направлении».

Я дошел до того, что у меня появился новый преобразуемый атрибут с именем «color» (не назвал преобразователь) и сгенерировал новый файл подкласса, содержащий новое свойство «color» (идентификатор типа).

Я просто недоумеваю. Может кто-нибудь дать мне какое-то определенное руководство о том, как действовать дальше?

Я использую MagicalRecord для взаимодействия с Core Data, если это имеет значение.

Большое спасибо за помощь!

Автор: rattletrap99 Источник Размещён: 23.05.2014 05:22

Ответы (3)


32 плюса

19664 Репутация автора

Решение

Ваш атрибут должен иметь тип Transformable. Преобразователь значений по умолчанию (NSKeyedUnarchiveFromDataTransformerName) может преобразовывать любой объект, соответствующий NSCoding.

  1. Отметьте атрибут как тип "Транформируемый".
  2. Необязательно: Задайте для имени преобразователя значения значение «NSKeyedUnarchiveFromDataTransformerName». Если вы этого не сделаете, он все равно будет по умолчанию.

Вот так

Вам не нужно больше ничего делать. Помните, что вы не сможете сопоставить трансформируемый атрибут с предикатом или отсортировать их. Они в значительной степени просто хранилище - преобразователь значений преобразует значение объекта в NSData, что сохраняется в хранилище. Когда возникает ошибка атрибута, Core Data использует преобразователь в другом направлении, чтобы перейти от NSData к типу вашего объекта.

Автор: quellish Размещён: 23.05.2014 07:39

0 плюса

481 Репутация автора

Чтобы сохранить UIColor в основных данных, вам необходимо разделить значения красного, синего и зеленого. Затем в своем коде создания извлеките значения RGB и создайте объект UIColor с полученными результатами. Это намного проще, чем кажется, и вам не нужно работать с NSKeyArchiver / Unarchiver или NSUserDefaults.

В вашей модели данных в вашей цветовой сущности создайте три атрибута: красный, зеленый и синий типа float. Затем подкласс NSManagedObject для объекта цвета. (если вы работали с основными данными до того, как это должно звучать знакомо.) Но это не вопрос о том, как использовать основные данные, поэтому я к этому вернусь.

Ради аргумента мы собираемся сгенерировать случайный цвет и сохранить его в основных данных (вы можете установить значения RGB на любой цвет, который вы пожелаете).

Сначала создайте три свойства типа float в файле реализации того класса, который вы собираетесь использовать.

@property (nonatomic) float randomRedColor;
@property (nonatomic) float randomBlueColor;
@property (nonatomic) float randomGreenColor;

Настройте свой метод сохранения в базовые данные как минимум с 3 параметрами типа float для каждого значения RGB. Помните, что атрибуты сущностей должны быть объектами, а не примитивного типа, поэтому при установке значения для ключа оберните значения с плавающей точкой в ​​NSNumber.

-(void) withColors:(float)redColor withBlue:(float)blueColor withGreen:(float)greenColor{

//set up NSManagedObjectContext/EntityDescription/ManagedObject (core data)

self.randomRedColor = redColor;
self.randomBlueColor = blueColor;
self.randomGreenColor = greenColor;

[newCategory setValue:[NSNumber numberWithFloat:redColor] forKey:@"red"];
[newCategory setValue:[NSNumber numberWithFloat:blueColor] forKey:@"blue"];
[newCategory setValue:[NSNumber numberWithFloat:greenColor] forKey:@"green"];

//save new objects (core data)

Где бы вы ни планировали вызывать этот метод, вы создадите три числа с плавающей точкой со случайными значениями и передадите их: (Мне нравится делать все эти настройки в источнике данных, поэтому не беспокойтесь о моем sharedInstance. Если вы не не знакомы с шаблоном синглтона, не волнуйтесь, я просто вызываю метод и передаю случайно сгенерированные значения в качестве аргументов.)

float red = (arc4random()%256/256.0);
float blue = (arc4random()%256/256.0);
float green = (arc4random()%256/256.0);

[[DataSource sharedInstance] withColors:red withBlue:blue withGreen:green];

Теперь просто импортируйте файл заголовка Color NSManagedObject и создайте свойство Color NSManagedObject. В этом случае мы назовем его * color:

@property (nonatomic, strong) Color *color 

Предполагая, что любой, кто читает это, знает, как выполнить запрос на выборку, мы теперь будем использовать наши * красные * синие и * зеленые атрибуты, которые были предоставлены, когда мы подклассировали нашу сущность Color.

float red = [self.category.red floatValue];
float green = [self.category.green floatValue];
float blue = [self.category.blue floatValue];

остается только сохранить полученные значения в объекте UIColor:

UIColor *randomRGBColor = [[UIColor alloc] initWithRed:red green:green blue:blue alpha:1.0]; 

Теперь все готово. Вы успешно сохранили объект UIColor. Надеюсь, это поможет!

Автор: Alex Blair Размещён: 22.07.2015 07:40

7 плюса

4587 Репутация автора

Доступен еще один вариант, Swift 3

extension UIColor {
    class func color(withData data:Data) -> UIColor {
         return NSKeyedUnarchiver.unarchiveObject(with: data) as! UIColor
    }

    func encode() -> Data {
         return NSKeyedArchiver.archivedData(withRootObject: self)
    }
}

использование

var myColor = UIColor.green
// Encoding the color to data
let myColorData = myColor.encode() // This can be saved into coredata/UserDefaulrs
let newColor = UIColor.color(withData: myColorData) // Converting back to UIColor from Data
Автор: Anand Размещён: 23.01.2017 06:57
Вопросы из категории :
32x32