Чтение онлайн

на главную - закладки

Жанры

iOS. Приемы программирования

Нахавандипур Вандад

Шрифт:

Постановка задачи

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

Решение

Используйте преобразуемые типы данных.

Обсуждение

Core Data позволяет создавать для объектов моделей свойства, а потом присваивать этим свойствам

типы данных. Выбор при этом довольно ограничен: Core Data допускает использование лишь таких типов данных, которые могут быть преобразованы в экземпляр NSData и обратно. Но существует целый ряд популярных классов, которые вы по умолчанию не можете использовать в таких свойствах. Что же делать? Применяйте преобразуемые свойства. Сначала поясню, что это такое.

Допустим, вы хотите создать в Core Data объект модели и назвать этот объект Laptop. У данного объекта будет два свойства: model типа String и color, которое должно относиться к типу UIColor. В Core Data не предоставляется такой тип данных, поэтому для его получения нам придется создать подкласс от NSValueTransformer. Назовем этот класс ColorTransformer. Вот что станем делать при его реализации.

1. Переопределим его метод класса allowsReverseTransformation и вернем от него значение YES. Так мы сообщим Core Data о возможности преобразования цветов в данные и обратно.

2. Переопределим метод transformedValueClass этого класса и возвратим от него имя класса NSData. Возвращаемое значение этого метода сообщает Core Data, в какой класс вы будете преобразовывать специальное значение. В данном случае происходит преобразование UIColor в NSData. Поэтому вы должны вернуть от этого метода имя класса NSData.

3. Переопределим метод экземпляра transformedValue:, относящийся к преобразователю. В нашем методе будем брать входящее значение (которое в данном случае будет экземпляром UIColor), преобразовывать его в NSData и возвращать эти данные.

4. Переопределим метод экземпляра reverseTransformedValue:, относящийся к преобразователю, и сделаем это с совершенно противоположной целью. Берем входящее значение (здесь — данные) и преобразуем его в цвет.

Имея всю эту информацию, продолжим реализацию преобразователя. Чтобы сохранять цвет как данные, просто разделим его на целочисленные компоненты, которые будут сохраняться в массиве:

#import <UIKit/UIKit.h>

#import «ColorTransformer.h»

@implementation ColorTransformer

+ (BOOL) allowsReverseTransformation{

return YES;

}

+ (Class) transformedValueClass{

return [NSData class];

}

— (id) transformedValue:(id)value{

/* Преобразуем цвет в данные */

UIColor *color = (UIColor *)value;

CGFloat red, green, blue, alpha;

[color getRed:&red green:&green blue:&blue alpha:&alpha];

CGFloat components[4] = {red, green, blue, alpha};

NSData *dataFromColors = [[NSData alloc] initWithBytes: components

length: sizeof(components)];

return dataFromColors;

}

— (id) reverseTransformedValue:(id)value{

/* Выполняем
обратное преобразование из данных в цвет */

NSData *data = (NSData *)value;

CGFloat components[4] = {0.0f, 0.0f, 0.0f, 0.0f};

[data getBytes: components length: sizeof(components)];

UIColor *color = [UIColor colorWithRed: components[0]

green: components[1]

blue: components[2]

alpha: components[3]];

return color;

}

@end

Теперь возвращаемся к модели данных. Создадим управляемый объект Laptop и его атрибуты/свойства. Убедитесь, что атрибут color является преобразуемым. Выделив этот атрибут, нажмите на клавиатуре Alt+Command+3 и откройте Model Inspector (Инспектор модели) для этого атрибута. В поле name преобразуемого класса введите имя специального преобразователя. В данном случае это будет ColorTransformer (рис. 16.21).

Рис. 16.21. Создание модели с преобразуемым атрибутом

Теперь воспользуемся приемами, изученными в разделе 16.2, и сгенерируем файл класса для управляемого объекта Laptop. После этого перейдем к заголовочному файлу этого управляемого объекта. Как видите, атрибут color рассматриваемого класса относится к типу id:

#import <Foundation/Foundation.h>

#import <CoreData/CoreData.h>

@interface Laptop: NSManagedObject

@property (nonatomic, retain) NSString * model;

@property (nonatomic, retain) id color;

@end

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

Поделиться:
Популярные книги

Революция

Валериев Игорь
9. Ермак
Фантастика:
боевая фантастика
попаданцы
альтернативная история
5.00
рейтинг книги
Революция

Курсант: назад в СССР

Дамиров Рафаэль
1. Курсант
Фантастика:
попаданцы
альтернативная история
7.33
рейтинг книги
Курсант: назад в СССР

Кодекс Охотника

Винокуров Юрий
1. Кодекс Охотника
Фантастика:
фэнтези
юмористическое фэнтези
попаданцы
боевая фантастика
5.00
рейтинг книги
Кодекс Охотника

На границе империй. Том 10. Часть 4

INDIGO
Вселенная EVE Online
Фантастика:
боевая фантастика
космическая фантастика
попаданцы
5.00
рейтинг книги
На границе империй. Том 10. Часть 4

И в аду есть герои

Панов Вадим Юрьевич
5. Тайный Город
Фантастика:
боевая фантастика
9.19
рейтинг книги
И в аду есть герои

На границе империй. Том 7. Часть 2

INDIGO
8. Фортуна дама переменчивая
Фантастика:
космическая фантастика
попаданцы
6.13
рейтинг книги
На границе империй. Том 7. Часть 2

Черный Маг Императора 11

Герда Александр
11. Черный маг императора
Фантастика:
юмористическое фэнтези
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Черный Маг Императора 11

Родословная. Том 3

Ткачев Андрей Юрьевич
3. Линия крови
Фантастика:
городское фэнтези
аниме
фэнтези
фантастика: прочее
5.00
рейтинг книги
Родословная. Том 3

Варяг

Мазин Александр Владимирович
1. Варяг
Фантастика:
альтернативная история
9.10
рейтинг книги
Варяг

Кодекс Охотника. Книга X

Винокуров Юрий
10. Кодекс Охотника
Фантастика:
фэнтези
попаданцы
аниме
6.25
рейтинг книги
Кодекс Охотника. Книга X

Руководство по системной поведенченской психотерапии

Курпатов Андрей Владимирович
Научно-образовательная:
психотерапия и консультирование
5.00
рейтинг книги
Руководство по системной поведенченской психотерапии

Кодекс Охотника. Книга V

Винокуров Юрий
5. Кодекс Охотника
Фантастика:
фэнтези
попаданцы
аниме
4.50
рейтинг книги
Кодекс Охотника. Книга V

Князь Андер Арес 5

Грехов Тимофей
5. Андер Арес
Фантастика:
историческое фэнтези
фэнтези
героическая фантастика
5.00
рейтинг книги
Князь Андер Арес 5

Идеальный мир для Лекаря

Сапфир Олег
1. Лекарь
Фантастика:
фэнтези
юмористическое фэнтези
аниме
5.00
рейтинг книги
Идеальный мир для Лекаря