2012-01-31 12 views
5

He creado objetos que son interfaces para un servicio web. Un objeto típico sería un "TaskService". Cuando un cliente utiliza uno de estos objetos, invoca uno de los métodos del servicio (como "GetTasks") y el servicio se activa de forma asíncrona para llamar al servicio web remoto y publicar los datos recuperados a través de un delegado.Singleton con un delegado: ¿Buena o mala idea?

Actualmente, para utilizar uno de estos servicios, debe crearlo con [[TaskService alloc] init], pero decidí que tiene más sentido convertir cada servicio en un objeto singleton.

Es común ver objetos únicos que mantienen referencia a los delegados? Mi principal problema con el diseño, es que cada objeto, siempre que requiera el uso de un servicio en particular, tendrá que establecerse como el delegado antes de invocar el servicio, lo que no me parece del todo correcto ... ¿Qué pasa si otro objeto ¿Debería establecerse como el delegado entre usted y usted como delegado e invocando el servicio?

¡Muchas gracias de antemano!

Saludos, Nick

Respuesta

4

Imo esto no es una buena idea que el motivo por el que se cita. El patrón de Singleton es realmente para cosas de las que solo hay una, pero parece que su aplicación puede necesitar varias instancias de estos servicios. Creo que terminará trabajando en esto (utilizando una cola de operaciones o algún tipo de multiplexor de delegados) cuando realmente solo necesite crear instancias de varias instancias de su servicio.

+0

que no tienen idea de lo que es un multiplexor delegado (emisora ​​de algún tipo?), Pero suena demasiado complicado para mí para tratar de poner en práctica, así que voy a tratar de mantenerse alejado de nada por el estilo! Para implementar una cola de operaciones, ¿estaría en lo cierto al pensar que cada método tendría que tomar un delegado/parámetro como argumento?Entonces, ¿se podrían poner en cola "solicitudes", con delegados asociados que se llamarán una vez que se completen? –

+0

Un multiplexor de delegado es un término que acabo de componer para el código que escribiría dentro de su singleton para descubrir a qué delegado enviar un resultado dado. Una opción que encapsularía mucho mejor cada operación (una búsqueda y notificación del delegado). Así que sí, las solicitudes se pondrían en cola de esta manera. – Rayfleck

4

Cuando la ocasión lo requiere la utilización de un objeto Singleton, siempre evitar delegación por la razón que usted cita. Los consumidores de un singleton no pueden saber (sin una codificación fea) si están pisando los dedos de los otros consumidores al establecerse como el único delegado del singleton. NSNotifications son una herramienta mucho más limpia para el trabajo; cualquier cantidad arbitraria de oyentes puede consumir las notificaciones sin importar quién más puede estar escuchando.

Delegación funciona mejor cuando hay una clara propiedad entre las clases. Nadie posee un singleton.

+0

Debo admitir que no sé mucho sobre NSNotifications, así que tendré que buscarlo. Parece que podría ser similar a un concepto en otros idiomas con el que estoy familiarizado, sin embargo, donde los "oyentes" se agregan a una lista y cada oyente recibe una notificación sobre ciertos eventos. Esto me vendría bien, creo, así que gracias por la propina. –

+0

(No pisar los dedos de los pies de Matt, pero ...) sí, NSNotifications son análogas a los oyentes (los llamamos observadores). OMI, si aprendes solo una técnica esta semana, sería - son increíblemente útiles, especialmente en las clases de desacoplamiento y sus respectivas tareas. – Rayfleck

+0

Gracias por el consejo. ¡Comprobaré NSNotifications de inmediato! –

0

Singleton no es realmente el problema, que causa el mismo tipo de problemas con sólo una clase de instancias y pasándolo sobre como una variable global. Como otros han mencionado una cola es una posibilidad, o cuando invocas una tarea en un servicio en tu Singleton tienes un objeto TaskRequest que pasa el método y el delegado de devolución de llamada, por lo que las solicitudes no pueden pisotearse entre sí. De hecho, sería una buena idea hacer eso con una cola de todos modos.

0

El alcance de un singleton es toda la aplicación. Por ejemplo: Consideremos el ejemplo de la aplicación comercial los datos del registrador, el ID del usuario que debe ser accesible en diferentes partes de la aplicación como orden, pago, carro, etc.

Los delegados se utilizan para la comunicación 1 a 1, por ejemplo: puede tomar como ejemplo Tiene dos clases de TV y dispositivo de control remoto. Quieres cambiar el canal de TV. Los métodos delegados de TV para cambiar el canal se implementan en la clase de dispositivo de control remoto. Entonces usa el dispositivo de control remoto y cambia el canal del televisor.

El Singleton se utiliza para comunicarse con varios receptores, mientras que el patrón delegación se usa por lo general para 1 a 1 de comunicación.

Cuestiones relacionadas