3

J'écris une application où le soutien pour les «promotions» est nécessaire, et ces promotions pourraient être arbitrairement complexes et de nombreuses données différentes pourraient être pertinentes dans leur calcul. Par conséquent, alors que dans les premiers stades de développement, je ne veux pas inventer un schéma de spécification complet pour ces choses, je préfère écrire chacun dans Objective-C et ensuite sérialiser en quelque sorte le code compilé dans la base de données (CoreData) pour rappel et exécution ultérieurs.Existe-t-il un moyen de sérialiser/désérialiser un bloc Objective-C?

Est-ce possible? Je pensais que les blocs GCD pourraient être un bon candidat pour cela, bien que je ne connaisse aucune méthode prête à l'emploi pour les sérialiser/les désérialiser.

Merci pour tout conseil.

modifier: ceci est une application iPhone si malheureusement je ne peux pas utiliser quelque chose comme le décapage de la fonction Python ... il doit être Objective-C droite ...

Répondre

4

Je ne pense pas qu'il soit possible de sérialisation des blocs.

Je voudrais encapsuler les données dans une classe et implémenter le protocole NSCoding. Par exemple.

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

puis

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

maintenant vous avez besoin de mettre en œuvre diverses choses

@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 

De même pour la promotion de type Y, Z, etc. Maintenant, il peut être sauvegardé dans un fichier, ou NSData, en utilisant NSKeyedArchiver. Ensuite, vous pouvez revivre l'objet de promotion sans se référer au type spécifique (X, Y, Z) par

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

Pour sérialisation en général, lisez this Apple doc.

+0

Merci beaucoup pour les conseils, cela semble être une bonne façon de procéder. – glenc