Est-il possible de faire passer un bloc entièrement formé (un bloc avec tous ses paramètres inclus) dans une méthode pour ensuite exécuter ce bloc dans la méthode?Passer un bloc en paramètre
Au moment où je l'ai répété cette structure dans mon projet:
if (//block exists)
{
if (self.returnOnMainThread)
{
dispatch_async(dispatch_get_main_queue(),^
{
//call block here
});
}
else
{
//call block here
}
}
Cependant Idéalement, je voudrais faire abstraction du code ci-dessus clunk dehors dans une méthode similaire à:
- (void) reportSuccessWithBlock:(GenericBlockType)block{
if (block)
{
if (self.returnOnMainThread)
{
dispatch_async(dispatch_get_main_queue(),^
{
block;
});
}
else
{
block;
}
}
}
EDIT:
Le type de bloc ne serait pas connu à l'avance.
Ainsi, le chemin d'appel pourrait ressembler à ceci
- (void) someMethod:(void (^)(NSArray *array))success
{
//Some code here setting up the array to be passed back
[self reportSuccessWithBlock:success(array)];
}
Il y a quelques hypothèses dans le code ci-dessus (que je ne sais pas sont possibles):
- Les méthodes peuvent accepter bloc générique types
- Un bloc peut être passé avec tous ses paramètres présents mais sans exécuter réellement
Quand vous dites « Le bloc lui-même peut contenir un certain nombre de différentes variables », voulez-vous dire le bloc peut accepter un nombre différent de paramètres? – trojanfoe
@trojanfoe Ce que je veux dire, c'est que cette méthode devrait être capable d'accepter des blocs avec des signatures différentes, par ex. (void (^) (NSArray * tableau)) success ou (void (^) (dictionnaire NSDictionary *, valeur NSUInteger)) succès – williamb
Ce sera un problème car vous devez fournir les paramètres aux blocs et si vous ne le faites pas savoir ce qu'ils seront, alors comment pouvez-vous faire cela? C'est peut-être possible, mais ça va être désordonné et ça ne sonne pas comme si ça en valait la peine. – trojanfoe