¿Cómo puedo pasar de Block
a a Function
/ Method
?
Lo intenté - (void)someFunc:(__Block)someBlock
sin resultado.
es decir. ¿Cuál es el tipo de a Block
?
objective-c
objective-c-blocks
Jacksonkr
fuente
fuente
Respuestas:
El tipo de un bloque varía según sus argumentos y su tipo de retorno. En el caso general, los tipos de bloque se declaran de la misma manera que los tipos de puntero de función, pero reemplazando el
*
con a^
. Una forma de pasar un bloque a un método es la siguiente:Pero como puedes ver, eso es desordenado. En su lugar, puede usar a
typedef
para hacer que los tipos de bloques sean más limpios:Y luego pasa ese bloque a un método como este:
fuente
NSNumber *
ostd::string&
, o cualquier otra cosa que podría pasar como un argumento de función. Esto es solo un ejemplo. (Para un bloque que es equivalente a excepción de la sustituciónid
conNSNumber
, latypedef
habríatypedef void (^ IteratorWithNumberBlock)(NSNumber *, int);
.)NS_NOESCAPE
, peroenumerateObjectsUsingBlock
me dicen que no escapan, pero no veoNS_NOESCAPE
ningún lugar en el sitio, ni se menciona el escape en absoluto en los documentos de Apple. ¿Puede usted ayudar?La explicación más fácil para esta pregunta es seguir estas plantillas:
1. Bloquear como parámetro de método
Modelo
Ejemplo
Otro uso de casos:
2. Bloquear como una propiedad
Modelo
Ejemplo
3. Bloquear como argumento de método
Modelo
Ejemplo
4. Bloquear como una variable local
Modelo
Ejemplo
5. Bloquear como typedef
Modelo
Ejemplo
fuente
Esto puede ser útil:
fuente
Puede hacer esto, pasando el bloque como un parámetro de bloque:
fuente
Una forma más de pasar bloque usando las funciones с en el ejemplo a continuación. He creado funciones para realizar cualquier cosa en segundo plano y en la cola principal.
archivo blocks.h
archivo blocks.m
Luego importe import blocks.h cuando sea necesario e invoque:
fuente
También puede establecer el bloqueo como una propiedad simple si es aplicable para usted:
¡asegúrese de que la propiedad de bloque sea "copiar"!
y, por supuesto, también puedes usar typedef:
fuente
También invocas o llamas a un bloque usando la sintaxis habitual de la función c
Más información sobre bloques aquí
http://developer.apple.com/library/ios/#documentation/cocoa/Conceptual/Blocks/Articles/bxGettingStarted.html#//apple_ref/doc/uid/TP40007502-CH7-SW1
fuente
Siempre tiendo a olvidarme de la sintaxis de bloques. Esto siempre viene a mi mente cuando necesito declarar un bloqueo. Espero que esto ayude a alguien :)
http://fuckingblocksyntax.com
fuente
Escribí un Bloque de finalización para una clase que devolverá los valores de los dados después de que hayan sido sacudidos:
Definir typedef con returnType ( declaración
.h
anterior@interface
)Definir a
@property
para el bloque (.h
)Definir un método con
finishBlock
(.h
)Inserte el método definido anterior en el
.m
archivo y comprométasefinishBlock
a@property
definido antesPara desencadenar
completionBlock
pasar variableType predefinida (no olvide comprobar sicompletionBlock
existe)fuente
A pesar de las respuestas dadas en este hilo, realmente tuve problemas para escribir una función que tomara un Bloque como función, y con un parámetro. Finalmente, esta es la solución que se me ocurrió.
Quería escribir una función genérica
loadJSONthread
, que tomaría la URL de un servicio web JSON, cargaría algunos datos JSON de esta URL en un hilo de fondo y luego devolvería un NSArray * de resultados a la función de llamada.Básicamente, quería mantener toda la complejidad del hilo de fondo oculta en una función genérica reutilizable.
Así es como llamaría a esta función:
... y este es el bit con el que luché: cómo declararlo y cómo hacer que llame a la función Bloquear una vez que se cargaron los datos, y pasar
Block
un NSArray * de registros cargados:Esta pregunta de StackOverflow se refiere a cómo llamar a funciones, pasando un Bloque como parámetro, por lo que he simplificado el código anterior y no he incluido la
loadJSONDataFromURL
función.Pero, si está interesado, puede encontrar una copia de esta función de carga JSON en este blog: http://mikesknowledgebase.azurewebsites.net/pages/Services/WebServices-Page6.htm
¡Espero que esto ayude a otros desarrolladores de XCode! (¡No olvide votar esta pregunta y mi respuesta, si es así!)
fuente
La plantilla completa se ve como
fuente