¿Cómo puedo pasar de Blocka a Function/ Method?
Lo intenté - (void)someFunc:(__Block)someBlocksin 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
typedefpara 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ónidconNSNumber, latypedefhabríatypedef void (^ IteratorWithNumberBlock)(NSNumber *, int);.)NS_NOESCAPE, peroenumerateObjectsUsingBlockme dicen que no escapan, pero no veoNS_NOESCAPEningú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
.hanterior@interface)Definir a
@propertypara el bloque (.h)Definir un método con
finishBlock(.h)Inserte el método definido anterior en el
.marchivo y comprométasefinishBlocka@propertydefinido antesPara desencadenar
completionBlockpasar variableType predefinida (no olvide comprobar sicompletionBlockexiste)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
Blockun 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
loadJSONDataFromURLfunció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