Есть ли способ сериализации / десериализации блока Objective-C? - PullRequest
3 голосов
/ 24 июля 2010

Я пишу приложение, в котором требуется поддержка «промо-акций», и эти промо-акции могут быть произвольно сложными, и в их расчете может быть много разных частей данных. Поэтому, хотя на ранних этапах разработки я не хочу изобретать для этих целей полную схему спецификации, я бы просто написал каждую в Objective-C, а затем каким-то образом сериализовал скомпилированный код в базу данных (CoreData). для последующего отзыва и исполнения.

Возможно ли это как-нибудь? Я думал, что блоки GCD могут быть хорошим кандидатом для этого, хотя я не знаю ни одного готового метода их сериализации / десериализации.

Спасибо за любой совет.

edit: это приложение для iPhone, поэтому, к сожалению, я не могу использовать что-то вроде функции Python для выбора функций ... это должно быть просто Objective-C ...

1 Ответ

4 голосов
/ 24 июля 2010

Я не думаю, что возможно сериализовать блоки.

Я бы инкапсулировал данные в класс и реализовал протокол NSCoding. Э.Г.

@interface Promotion :NSObject<NSCoding> {   // protocol might be better
}
-(void)calculatePromotion; 
@end

тогда

@interface PromotionX : Promotion {
    ... data needed for a promotion of type X ...
} 
-initWithDataA: (A*)a andDataB:(B*) b
@end

Теперь вам нужно реализовать различные вещи

@implementation PromotionX
-initWithDataA: (A*)a and DataB:(B*)b{
    ... save a and b to the ivars ...
}
-(void)calculatePromotion{
    ... do something with a and b 
}

#pragma mark Serialization support
-initWithCoder:(NSCoder*)coder{
    ... read off a and b from a coder ...
}
-(void)encodeWithCoder:(NSCoder*)coder{
    ... write a and b to a coder ...
}
@end

Аналогично для продвижения типа Y, Z и т. Д. Теперь его можно сохранить в файл или NSData, используя NSKeyedArchiver. Затем вы можете воскресить объект продвижения, не обращаясь к определенному типу (X, Y, Z) по

NSData* data = ... somehow get the data from the file / CoreData etc...
Promotion* promotion = [NSKeyedUnarchiver unarchiveObjectWithData:data];
[promotion calculatePromotion];

Для сериализации в общем, прочитайте этот документ Apple .

...