Ahora que los bloques finalmente son compatibles para el desarrollo de iphone/ipad, ¿eliminan por completo la necesidad de delegados o son delegados aún más limpios como una implementación de interfaz completa, mientras que los bloques son más apropiados para tareas individuales?¿Los bloques de código reemplazan por completo a los delegados?
Respuesta
Un pensamiento interesante: aunque podría usar un bloqueo/cierre en lugar de un método de devolución de llamada, no veo cómo podría usarse esto para reemplazar el sistema de delegado, después de todo, la delegación es casi un medio de objeción comunicación de objetos y por lo tanto las posibilidades son mucho más ricas que simplemente la ejecución de una pieza de código arbitraria.
Como tal, tengo que estar de acuerdo con su comentario "más apropiado para tareas individuales" (e incluso solo algunas tareas aisladas).
He estado buscando documentación oficial sobre esto pero aún no he encontrado ninguna. En base a la revisión de las nuevas clases expuestas en iOS 5 y las adiciones hechas a clases preexistentes, recomiendo a mi equipo suponer un protocolo de delegado, pero para proporcionar un bloque en su lugar cuando existe un nexo causal directo entre ese específico y llamada y rendimiento del bloque.
Por lo tanto, como regla general, un protocolo delegado es correcto cuando hay una necesidad de comunicación continua, las acciones que causan la comunicación son difusas o las acciones emanan de una tercera fuente. Los bloques están principalmente asociados con acciones asincrónicas y clases de un solo disparo en particular.
EDIT: así, algunos ejemplos:
UIScrollViewDelegate
es correctamente un protocolo delegado porque (i) hay una amplia gama de cosas que pueden necesitar ser comunicados; (ii) pueden necesitar ser comunicados en cualquier orden y en cualquier momento; y (iii) se comunicarán por razones que escapan al control del delegado.
NSURLConnection +sendAsynchronousRequest:queue:completionHandler:
correctamente toma un bloque para entregar resultados porque (i) hay exactamente un resultado para informar; y (ii) el informe regresa como una consecuencia directa de la acción tomada por la persona que llama.
Estaba tratando de decidir si debería dejar un comentario sobre otras respuestas o dejar una respuesta propia. Yo decidí y aquí está.
Soy desarrollador de C# principalmente, así que puedo ver fácilmente cómo podría reemplazar todo el patrón de delegación con bloques porque C# siempre ha tratado a los verbos como ciudadanos de primera clase. De hecho, esa fue una de las cosas más difíciles de acostumbrar cuando comencé a trabajar con Java y la plataforma Android. Esa experiencia lo hizo más fácil cuando aprendí Objective-C y Cocoa.
Creo que es un patrón de observador en comparación con un detalle de implementación de patrón de delegación que no me entusiasma. Estoy bastante compuesto por herencia, así que uso el patrón de delegación con frecuencia, incluso en C#.
No creo que ninguno deba reemplazar al otro. Creo que los dos patrones deberían usarse donde cada uno es el más apropiado; sin embargo, he encontrado varios casos en los que definitivamente preferiría el patrón de observador sobre el patrón de delegación en Cocoa.
Por ejemplo, al tratar con el resultado de UIAlertView creo que debería basarse en bloques en lugar de en delegados. Eso siempre me pareció un poco extraño, pero el bloqueo no estaba disponible cuando se desarrolló esa parte específica de la API. Como resultado, nunca estuve seguro si Apple sintió que este debería ser el enfoque preferido o si ese era el único enfoque en ese momento.
Recientemente, integé GameKit en uno de mis juegos y descubrí que la mayoría de las llamadas asíncronas (de hecho, todas las que he usado) no usan delegados; ellos usan bloques. Me imagino que si pudieran reescribir el UIAlertView hoy, probablemente usarían bloques en lugar de delegados para manejar las devoluciones de llamada luego de la entrada del usuario. Por supuesto, eso es solo especulación.
Respuesta corta a su pregunta: prefiero el patrón de delegación al componer objetos para evitar jerarquías de herencia innecesariamente complejas y prefiero el patrón de observador cuando trato con cosas análogas a eventos como devoluciones de llamada y manejadores de eventos. Yo uso delegados para el primero y bloques para el segundo.
Estoy haciendo mi propia investigación sobre el tema y este artículo me pareció muy instructivo, escrito por Justin Driscoll, y espero que pueda ayudar a alguien más también.
Aquí está el enlace: Communicating with Blocks in Objective-C
Delegados - Se puede usar delegado cuando se quiere conocer el proceso/Eventos/Estado. Por ejemplo, en NSURLConnectionDelegate obtendrá el estado de los datos con dos o más métodos de delegado .didReceive: NSData connectionDidFinishLoading
Bloques - Se puede usar el bloque sólo cuando se espera un resultado o error
mejor referencia - http://blog.stablekernel.com/blocks-or-delegates/
- 1. ¿Cómo puedo deshabilitar por completo los contratos de código?
- 2. ¿Por qué UITableView llama a los métodos delegados de UIScrollView?
- 3. NSURLConnection no llama a los métodos delegados
- 4. MVC3 Razor: Viendo html dentro de los bloques de código
- 5. ¿Los datagramas siempre se reciben por completo?
- 6. CUDA que determina los hilos por bloque, bloques por cuadrícula
- 7. ¿Por qué los delegados/lambdas anónimos no infieren los tipos en los parámetros out/ref?
- 8. ¿Cómo se revisan los bloques grandes del nuevo código
- 9. bloques de código perl
- 10. ¿Beneficios de los bloques de scoping?
- 11. Crear delegados dinámicamente con los nombres de los parámetros
- 12. C# Cadena de responsabilidad con los delegados
- 13. ¿Por qué los delegados anónimos omiten argumentos, pero lambdas no?
- 14. ¿Por qué emma no da cobertura completa a los bloques finalmente?
- 15. Pregunta sobre foreach y los delegados
- 16. Rendimiento de llamar a los delegados vs métodos
- 17. Problema con los delegados en C#
- 18. ¿Cómo se reemplazan los operadores existentes sin invocarlos en Io?
- 19. ¿Cuál es el trato con los delegados?
- 20. Bloques de código en python
- 21. Cómo eliminar por completo los bordes de la tabla HTML
- 22. Espere a que se completen los bloques de assetForURL
- 23. Uso correcto de los bloques iteradores
- 24. ¿La mejor explicación de los bloques Ruby?
- 25. Bloques de código anónimo
- 26. ¿Por qué los navegadores reemplazan el valor de ancho asignado mediante css?
- 27. Cómo deshabilitar por completo los reintentos de NServiceBus
- 28. bloques de código estático
- 29. cómo eliminar por completo los reconocedores de gestos
- 30. iOS ¿Los métodos invocados por los delegados y observadores se ejecutan en el hilo principal?
Por favor, explique un poco más si hay ejemplos que serían geniales. Gracias – Sandy
¿No entendí la comunicación? – Sandy
@Sandy Estoy defendiendo que los bloques son una buena forma de entregar los resultados de acciones específicas, pero una mala base para una conversación más general. Proporcionar un bloqueo es como el oyente que dice 'así es como me hablas'; un protocolo de delegado es como el hablante diciendo 'así es como te hablaré'. Si el hablante decide principalmente cuándo hablar, debería dictar cómo habla. Si el oyente simplemente pide que se haga algo específico y los resultados se informan en ese momento, tiene sentido que diga '... e informe de esta manera'. – Tommy