2011-10-20 6 views
1

J'ai récemment essayé de comprendre l'importance des blocs dans la programmation (Objective-C en particulier). Ils sont évidemment beaucoup utilisés dans les API iOS/Cocoa, donc j'essaie de les comprendre. La plupart du temps, je ne comprends toujours pas pourquoi vous utiliseriez un bloc par rapport à la simple création d'une fonction auxiliaire distincte. Par exemple, si je crée un bloc qui implémente une fonction de tri, ne serait-il pas plus facile de créer cette fonction en tant que méthode d'une classe auxiliaire pour que tous les objets du code puissent l'utiliser plus facilement?Veuillez expliquer l'utilité des blocs dans Objective-C

+3

Et si votre fonction de tri est une fonction unique qui n'est pas utilisée ailleurs? Vous minimisez la surface de votre code et augmentez la localité du code en utilisant un bloc. –

Répondre

2

Les blocs sont une bonne alternative à callbacks ou délégués, si rien d'autre que d'améliorer la lisibilité du code en gardant votre logique métier locale au code appelant.

Mais ils sont tellement plus: très utile pour l'asynchronicité, et une nécessité si vous voulez utiliser GCD pour améliorer les performances.

Mis à part les documents officiels d'Apples, je peux vous recommander de lire l'excellent Practical Blocks de Mike Ash.

+0

Je pense que l'idée de «garder la logique d'entreprise locale au code d'appel» est l'endroit où je me faisais trébucher. Et si vous avez besoin de réutiliser la logique métier? Ne le garde pas près du code moins sa réutilisabilité? – chrismanderson

+2

Les blocs ne vous empêchent pas de refactoriser le code réutilisable pour les assistants publics ou privés, mais ils peuvent aider à augmenter la brièveté du code et à le réutiliser de manière complémentaire. Disons que vous refactorisez du code réutilisable contenant une opération asynchrone à 'myNewHelperMethod: (id) obj'. Supposons maintenant que vous voulez que votre objet appelant fasse des choses après la fin de l'assistant. Vous pouvez utiliser la délégation ou NSNotifications, mais les deux sont assez lourds pour cela et boueux le flux de contrôle. Au lieu de cela, vous pouvez demander à votre assistant de recevoir un bloc de l'appelant: 'mynewHelperMethod: (id) obj withCompletionBlock:^(id obj) aBlock' – followben

2

Une caractéristique intéressante des blocs est qu'ils peuvent être utilisés partout où des objets peuvent être utilisés, ainsi vous pouvez par ex. stocker des blocs dans un tableau ou un dictionnaire. Une autre chose intéressante est que vous pouvez passer des blocs dans un objet ou entre des objets comme arguments de méthode, par exemple .:

- (void)processDataWithBlock:(void (^)(void))block 
+ (void)animateWithDuration:(NSTimeInterval)duration animations:(void (^)(void))animations 

La deuxième méthode est même une API UIView. On pourrait dire que les pointeurs de fonction feraient ici, mais cela serait plus compliqué, moins flexible et incohérent. De plus, les blocs peuvent accéder aux variables locales et aux variables d'instance sans les passer en argument.

Ce sont mes 2 cents de blocs point de vue de l'utilisateur, mais je ne suis pas d'un expert ...

Questions connexes