Добавление переменной экземпляра в NSData - PullRequest
2 голосов
/ 26 января 2012

Итак, я понимаю, что категории в Objective-C можно использовать для добавления методов в классы без необходимости создавать подклассы. Я также понимаю, что эти категории нельзя использовать для добавления переменных экземпляра в классы.

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

Моя проблема заключается в следующем:

У меня есть базовая модель данных, которая содержит NSURL и NSData. NSData отображает данные для NSURL. Когда представление должно отображать данные, я делаю следующую проверку: --- Если [NSData bytes]> 0, отобразить NSData. --- В противном случае извлеките данные в NSURL и отобразите данные, когда они вернут

Достаточно просто. Тем не менее, я сталкиваюсь с проблемами, когда NSURL обновляется. Поэтому, если я изменю путь NSURL новым изображением, поскольку [байты NSData] уже больше 0, я не выполняю дополнительный вызов для извлечения нового изображения.

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

Кто-нибудь знает некоторые простые решения для этого? Возможно, в моем понимании расширений классов есть пробел, или просто не существует простого способа.

1 Ответ

2 голосов
/ 26 января 2012

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

Категории используются в уже реализованных классах как способ добавления дополнительной функциональности. Они обычно необходимы, когда вы хотите добавить общий тип поведения к известному классу. Например. добавление метода к NSString + (NSString *) reversedString; , который возвращает обращенный экземпляр, чтобы вы могли затем использовать его следующим образом:

NSString *someString = @"string";
NSString *reverse = [someString reversedString]; 
NSLog(@"%@", someString); //this would output "gnirts"

.

Что касается вашей конкретной проблемы, я могу заверить вас, что ваша CoreDataModel не содержит NSURL или NSData. Поддерживаемые типы: примитивы, строки, двоичные данные и трансформируемые. Так что, если вы хотите, вы можете создать подкласс NSData или NSURL, а затем использовать его с CoreData, установив тип «преобразуемый». И после того, как вы это сделаете, вы можете создать подкласс NSData по своему усмотрению и использовать расширения класса в процессе, или просто использовать категорию для добавления необходимых вам методов в класс.

Цитата из Apple о преобразуемых атрибутах :

Идея трансформируемых атрибутов заключается в том, что вы получаете доступ к атрибут как нестандартный тип, но за кулисами Core Data использует экземпляр NSValueTransformer для преобразования атрибута в и из экземпляр NSData. Базовые данные затем сохраняют экземпляр данных в постоянный магазин.

...