3

我正在寫一個需要支持「促銷」的應用程序,這些促銷活動可能是任意複雜的,許多不同的數據片段可能與其計算相關。因此,在開發的早期階段,我不想爲這些東西創建一個完整的規範模式,我寧願只編寫Objective-C中的每一個,然後以某種方式將編譯後的代碼序列化到(CoreData)數據庫中以供以後召回和執行。有什麼方法可以序列化/反序列化Objective-C塊?

這是以任何方式可能嗎?我在想,GCD塊可能是一個很好的候選者,儘管我不知道任何對它們進行序列化/反序列化的開箱即用方法。

感謝您的任何建議。

編輯:這是一個iPhone應用程序,所以不幸的是我不能使用像Python函數酸洗...它必須是直的Objective-C ...

回答

4

我不認爲這是可能的序列化塊。

我會將數據封裝到一個類中,並實現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。 然後你就可以

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

復活晉級對象,而不參照特定類型(X,Y,Z)序列化一般,讀this Apple doc

+0

非常感謝您的建議,這似乎是一個很好的選擇。 – glenc 2010-07-25 15:32:44

相關問題