我可以安全地在程序地址空间中发布包含代码块的消息吗?测试有效,但这是合法的吗?
typedef void (^EmitBlock)(NSDictionary* args);
- (void) subscribe {
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(on_emit:) name:kEmit object:nil];
}
- (void) on_emit:(NSNotification*) notification
{
EmitBlock completion = [[notification userInfo] valueForKey:@"completion"];
completion(@{@"result" : @"Ok"});
}
- (void) post:(EmitBlock) completion {
[[NSNotificationCenter defaultCenter] postNotificationName:kEmit
object:nil userInfo:@{@"completion":
^(NSDictionay* args) { NSLog(@"%@", args); }
}];
}
答案 0 :(得分:5)
块是Objective-C对象,因此可以将它们放入字典中并使用它们 在通知的userinfo中。
但请注意,根据Transitioning to ARC Release Notes:
...将“堆栈”传递到“堆栈”时,您仍然需要使用
[^{} copy]
arrayWithObjects:
和其他保留的方法。
你应该把这个块的副本放到字典中:
[[NSNotificationCenter defaultCenter] postNotificationName:@"kEmit"
object:nil
userInfo:@{
@"completion" : [^(NSDictionary* args) { NSLog(@"%@", args); } copy]
}
];
答案 1 :(得分:0)
您可以使用库中的一个,例如https://github.com/cflesner/NSNotificationCenter-CLFBlockNotifications来使用带通知的块
我认为这是更安全的方法