2011-01-03 18 views
24

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

9

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).

40

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.

+0

Por favor, explique un poco más si hay ejemplos que serían geniales. Gracias – Sandy

+0

¿No entendí la comunicación? – Sandy

+8

@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

8

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.

+0

Gran respuesta corta. – poiuytrez

+0

De hecho, en iOS 8, UIAlertView fue cambiado por un ViewController. Y el UIAlertViewController tiene acciones que usan bloques. – dcorbatta

1

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

0

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/

Cuestiones relacionadas