2013-05-14 2 views
0

На вопрос Multiple delegates per one object? один из ответов придумал интересное решение (по крайней мере, для моих наивных глаз): создание «разделителя делегатов», позволяющего объекту (в данном случае UIScrollView) иметь несколько делегатов (в этом случае UIScrollViewDelegate).Несколько делегатов для одного объекта? (последующий)

Код выглядит следующим образом:

@interface DelegateSplitter : NSObject 

-(void)addDelegate:(id)delegate; 
-(void)addDelegates:(NSArray*)array; 

@end 


@interface DelegateSplitter() 

@property NSMutableSet *delegates; 

@end 

@implementation DelegateSplitter 

-(id)init 
{ 
    self = [super init]; 
    _delegates = [NSMutableSet set]; 
    return self; 
} 

-(void)addDelegate:(id)delegate 
{ 
    [_delegates addObject:delegate]; 
} 

-(void)addDelegates:(NSArray *)array 
{ 
    [_delegates addObjectsFromArray:array]; 
} 

-(void)forwardInvocation:(NSInvocation *)anInvocation 
{ 
    for (id delegate in _delegates) 
    { 
    if([delegate respondsToSelector:anInvocation.selector]) 
    { 
     [anInvocation invokeWithTarget:delegate]; 
    } 
    } 
} 

- (NSMethodSignature*) methodSignatureForSelector: (SEL) selector 
{ 
    NSMethodSignature *our = [super methodSignatureForSelector:selector]; 
    NSMethodSignature *delegated = [[_delegates anyObject] 
            methodSignatureForSelector:selector]; 
    return our ? our : delegated; 
} 

- (BOOL) respondsToSelector: (SEL) selector 
{ 
    return [[_delegates anyObject] respondsToSelector:selector]; 
} 

Проблема с этим кодом является то, что он создает сохранить циклы, и в отличие от обычного делегата, вы не можете объявить его как

@property (assign) DelegateSplitter *splitter; 

Это однако представляется «лучшим» решением, чем оболочка. Так или иначе, чтобы избежать цикла удержания?

ответ

1

сколько делегатов вы собираетесь когда-нибудь понадобится, просто сделать свойство для 3 из них, и если вы нуждаетесь в более, то вам нужно радикально перестроить ваше приложение ...

гораздо лучше подход к есть делегат для каждого вида деятельности, делегат представления, источник данных и некоторый асинхронный сетевой делегат и т. д., если они в конечном итоге становятся тем же объектом, кто заботится ... он просто сработает.

Смежные вопросы