目標組播座:如何概括
我有可以使用的塊插上接收特定事件的各種屬性的類。
@interface SomeClass
@property (copy, nonatomic) void (^handler)(int arg1, int arg2);
@end
在客戶端代碼,我想動態添加/刪除處理程序塊,以該屬性,類似於MulticastDelegate在C#。
self.logger = ^(int arg1, int arg2){
NSLog(@"arg1 = %d, arg2 = %d", arg1, arg2);
};
void (^doSomething)(int, int) = ^(int arg1, int arg2){
if (arg1 == 42) {
// Do something.
}
};
例如,我想在logger
插上-(id)init
,但只有一定的方法在運行時使用doSomething
。雖然插入doSomething
,但仍應運行logger
。
當前實現
爲了保持塊,我想過使用NSMutableArray
存儲塊的副本和廣播事件到所有註冊的塊(觀察者模式)。
- (ID)初始
self.handlerBlocks = [NSMutableArray array];
__weak typeof(self) weakSelf = self;
self.object.handler = ^(int x, int y){
typeof(self) strongSelf = weakSelf;
if (!strongSelf) {
return;
}
for (void (^item)(int x, int y) in strongSelf.handlerBlocks) {
item(x, y);
}
};
[self.handlerBlocks addObject:[self.logger copy]];
- (無效)someOtherMethod
void (^doSomething)(int, int) = [^(int arg1, int arg2){
if (arg1 == 42) {
// Do something.
}
} copy];
[self.handlerBlocks addObject:doSomething copy];
// Do something.
[self.handlerBlocks removeObject:doSomething];
開放式問題
可以在方法推廣到塊與任何參數計數/類型?所以,我可以用這樣的:
MulticastBlock *b = [[MulticastBlock alloc] init];
self.object.handler = b;
[b addBlock:self.logger];
的這裏的問題是,self.object.handler
類型是void (^)(int, int)
。因此,MulticastBlock
需要模仿一個塊,將其收到的任何調用轉發給數組。
這裏描述的技術是否可以使用?
也許攔截所有的調用,複製他們爲每個數組元素,並賦予新的調用目標?
這有什麼意義調用轉發到具有不同簽名的塊?或者到具有不同簽名的塊列表? –
這些塊共享相同的簽名。但是,我想重複使用該模式,而不必爲每個回調類型手動創建數組。假設SomeClass有第二個處理程序塊'void(^ otherHandler)(int arg1,NSString * arg2,id arg3)'。用我目前的方法,我需要翻一番。 我列在最後的'MulticastBlock'將匹配任何簽名,因此可以重複使用。我想知道這樣一個普通的塊是否可能。 當然,您仍然需要爲每個處理程序都有不同的MulticastBlock實例,但它是2行而不是11個 – Etan