Gérer un groupe de NSOperation avec des dépendances

Je travaille sur une application qui créer des contenus et l'envoyer à un serveur. Le contenu est un titre, une image et l'emplacement. Rien de fantaisie.

Le backend est un peu compliqué donc, voici ce que j'ai à faire :

  • Permettre à l'utilisateur de prendre une photo, entrez un titre et d'autoriser la carte à utiliser son emplacement
  • Générer un identifiant unique pour le poste
  • La création d'un poste sur le backend
  • Téléchargez l'image
  • De rafraîchissement de l'INTERFACE utilisateur

J'ai utilisé un couple de NSOperation des sous-classes pour faire ce travail mais je ne suis pas fier de mon code, voici un exemple.

NSOperation *process = [NSBlockOperation blockOperationWithBlock:^{
    //Process image before upload
}];

NSOperation *filename = [[NSInvocationOperation alloc] initWithTarget: self selector: @selector(generateFilename) object: nil];

NSOperation *generateEntry = [[NSInvocationOperation alloc] initWithTarget: self selector: @selector(createEntry) object: nil];

NSOperation *uploadImage = [[NSInvocationOperation alloc] initWithTarget: self selector: @selector(uploadImageToCreatedEntry) object: nil];

NSOperation *refresh = [NSBlockOperation blockOperationWithBlock:^{
    //Update UI
    [SVProgressHUD showSuccessWithStatus: NSLocalizedString(@"Success!", @"Success HUD message")];
}];

[refresh addDependency: uploadImage];

[uploadImage addDependency: generateEntry];
[generateEntry addDependency: filename];
[generateEntry addDependency: process];

[[NSOperationQueue mainQueue] addOperation: refresh];
[_queue addOperations: @[uploadImage, generateEntry, filename, process] waitUntilFinished: NO];

Ici sont les choses que je n'aime pas: les

  • dans mon createEntry: par exemple, je suis stocker le nom de fichier généré dans une propriété, qui mées avec la portée mondiale de ma classe
  • dans le uploadImageToCreatedEntry: la méthode, je suis en utilisant dispatch_async + dispatch_get_main_queue() pour mettre à jour le message dans mon HUD
  • etc.

Comment voulez-vous gérer un tel flux de travail ? J'aimerais éviter l'incorporation de plusieurs achèvement des blocs et j'ai envie de NSOperation est vraiment la voie à suivre mais je crois aussi qu'il y a une meilleure mise en œuvre quelque part.

Merci!

source d'informationauteur Romain Pouclet