Comment puis-je passer un Block
à un Function
/ Method
?
J'ai essayé - (void)someFunc:(__Block)someBlock
en vain.
c'est à dire. Quel est le type pour un Block
?
objective-c
objective-c-blocks
Jacksonkr
la source
la source
Réponses:
Le type d'un bloc varie en fonction de ses arguments et de son type de retour. Dans le cas général, les types de bloc sont déclarés de la même manière que les types de pointeur de fonction, mais en remplaçant le
*
par un^
. Une façon de passer un bloc à une méthode est la suivante:Mais comme vous pouvez le voir, c'est compliqué. Vous pouvez à la place utiliser a
typedef
pour rendre les types de blocs plus propres:Et puis passez ce bloc à une méthode comme celle-ci:
la source
NSNumber *
oustd::string&
ou tout autre élément que vous pourriez passer comme argument de fonction. C'est juste un exemple. (Pour un bloc équivalent à l'exception du remplacementid
parNSNumber
, letypedef
seraittypedef void (^ IteratorWithNumberBlock)(NSNumber *, int);
.)NS_NOESCAPE
, mais onenumerateObjectsUsingBlock
me dit qu'ils ne s'échappent pas, mais je ne voisNS_NOESCAPE
nulle part sur le site, et l'échappement n'est pas du tout mentionné dans les documents Apple. Pouvez-vous m'aider?L'explication la plus simple de cette question est de suivre ces modèles:
1. Bloquer comme paramètre de méthode
Modèle
Exemple
Autre utilisation des cas:
2. Bloquer en tant que propriété
Modèle
Exemple
3. Bloquer comme argument de méthode
Modèle
Exemple
4. Bloquer en tant que variable locale
Modèle
Exemple
5. Bloquer comme typedef
Modèle
Exemple
la source
Cela peut être utile:
la source
Vous pouvez faire comme ceci, en passant block comme paramètre de bloc:
la source
Une autre façon de passer un bloc en utilisant les fonctions ñ dans l'exemple ci-dessous. J'ai créé des fonctions pour exécuter n'importe quoi en arrière-plan et sur la file d'attente principale.
fichier blocks.h
fichier blocks.m
Ensuite, importez blocks.h si nécessaire et invoquez-le:
la source
Vous pouvez également définir block comme une propriété simple si cela s'applique pour vous:
assurez-vous que la propriété de bloc est "copie"!
et bien sûr, vous pouvez également utiliser typedef:
la source
Vous invoquez ou appelez également un bloc en utilisant la syntaxe habituelle de la fonction c
Plus d'informations sur les blocs ici
http://developer.apple.com/library/ios/#documentation/cocoa/Conceptual/Blocks/Articles/bxGettingStarted.html#//apple_ref/doc/uid/TP40007502-CH7-SW1
la source
J'ai toujours tendance à oublier la syntaxe des blocs. Cela me vient toujours à l'esprit lorsque je dois déclarer un blocage. J'espère que cela aide quelqu'un :)
http://fuckingblocksyntax.com
la source
J'ai écrit un completionBlock pour une classe qui retournera les valeurs des dés après avoir été secoués:
Définissez typedef avec returnType ( déclaration
.h
ci-dessus@interface
)Définissez un
@property
pour le bloc (.h
)Définissez une méthode avec
finishBlock
(.h
)Insérer méthode définie précédente dans le
.m
fichier et engagerfinishBlock
à@property
définir avantPour déclencher,
completionBlock
passez-lui un type de variable prédéfini (n'oubliez pas de vérifier si le paramètrecompletionBlock
existe)la source
Malgré les réponses données sur ce fil, j'ai vraiment eu du mal à écrire une fonction qui prendrait un Block comme fonction - et avec un paramètre. Finalement, voici la solution que j'ai trouvée.
Je voulais écrire une fonction générique
loadJSONthread
, qui prendrait l'URL d'un service Web JSON, chargerait certaines données JSON de cette URL sur un thread d'arrière-plan, puis retournerait un NSArray * de résultats à la fonction appelante.Fondamentalement, je voulais garder toute la complexité du thread d'arrière-plan cachée dans une fonction générique réutilisable.
Voici comment j'appellerais cette fonction:
... et c'est le bit avec lequel j'ai eu du mal: comment le déclarer, et comment le faire appeler la fonction Block une fois les données chargées, et passer le
Block
NSArray * des enregistrements chargés:Cette question StackOverflow concerne la façon d'appeler des fonctions, en passant un bloc en tant que paramètre, j'ai donc simplifié le code ci-dessus et non inclus la
loadJSONDataFromURL
fonction.Mais, si vous êtes intéressé, vous pouvez trouver une copie de cette fonction de chargement JSON sur ce blog: http://mikesknowledgebase.azurewebsites.net/pages/Services/WebServices-Page6.htm
J'espère que cela aidera d'autres développeurs XCode! (N'oubliez pas de voter pour cette question et ma réponse, si c'est le cas!)
la source
Le modèle complet ressemble à
la source