iOS:使用NSNotificationCenter在userInfo中发布代码块?

时间:2014-04-02 11:22:47

标签: ios objective-c objective-c-blocks

我可以安全地在程序地址空间中发布包含代码块的消息吗?测试有效,但这是合法的吗?

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); }
    }];
}

2 个答案:

答案 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来使用带通知的块

我认为这是更安全的方法