No hay nada malo en tener un delegado para un producto único, pero crea una gran cantidad de casos de borde que usted necesita para manejar. Tales como:
Si el objeto A llama setDelegate :, seguido inmediatamente por el objeto B setDelegate vocación: Un objeto entonces nunca va a recibir llamadas de delegado.
Debe comprobar si es el delegado antes de desactivar el delegado de singleton. Generalmente, en dealloc
, llama al singleton.delegate = nil;
. Si otro objeto pasó a ser delegado después de que lo hizo, entonces usted acaba de causar que inesperadamente deje de ser delegado.
Singletons con delegados no es un patrón bien establecido. Sus soluciones deben variar según cuán robusto sea su caso de uso. Aquí hay algunas soluciones (en orden de las más fáciles -> más robustas).
Debe ser sencillo
El diseño de su aplicación a múltiples objetos nunca han de ser delegado del Singleton, al mismo tiempo (esto puede ser imposible).
NSNotification
Uso NSNotificationCenter para señalar eventos en lugar de delegación. Vea algunas de las otras respuestas publicadas en este hilo.
múltiples delegados
Extender el producto único para apoyar delegado múltiple. setDelegate:
sustituir con: addDelegate:
y removeDelegate:
@property (atomic) NSMutableArray *delegates;
- (void)addDelegate:(NSObject * <YourProtocol>)foo {
[self.delegates addObject:foo];
}
- (void)removeDelegate:(NSObject * <YourProtocol>)foo {
[self.delegates removeObject:foo];
}
- (void)signalDelegateEvent {
[self.delegates enumerateObjectsUsingBlock:^(id<YourProtocol> obj,
NSUInteger idx,
BOOL *stop) {
// call delegate method `foo` on each delegate
if ([obj respondsToSelector:@selector(foo)]) {
[obj foo];
}
}];
}
he utilizado el modelo multi-delegado con éxito en muchas aplicaciones. Tenga cuidado de pensar cómo multi-threading afecta las cosas si elige este enfoque.
¿Por qué un delegado fallaría? En su lugar, puede considerar utilizar 'NSNotificationCenter' para múltiples oyentes. –
Solo tengo una clase que deseo notificar, actualicé el contexto de la pregunta también por encima de – adit