通过[[NSNotificationCenter defaultCenter] postNotificationName]方法直接传递对象是否危险?

时间:2015-11-10 17:00:01

标签: ios nsnotificationcenter

我正在编写SDK并寻找通过NSNotification发送对象的最佳做法。

Apple和包括this在内的一些主题表明object中的postNotificationNamer参数应该是通知的发件人,在大多数情况下,self。您的自定义对象应该通过userInfo NSDictionary传递。来自Apple doc:

  

创建具有给定名称,发件人和信息的通知,并将其发布给接收者。

例如,不恰当的做法是:

[[NSNotificationCenter defaultCenter] postNotificationName:@"myNotification" 
                                                    object:myObject];

建议的方法是:

NSDictionary* userInfo = @{@"myMessage": myObject};
[[NSNotificationCenter defaultCenter] postNotificationName:@"myNotification" 
                                                    object:self 
                                                  userInfo:userInfo];

我尝试了两种方法,但它们都运行良好。问题是,使用以前的方法有任何风险吗?在我的情况下,我对通知的发送者不感兴趣,但使用后一种方法在我想发送的实际对象周围引入了一个额外的包装器(NSDicionary)。

2 个答案:

答案 0 :(得分:3)

使用object参数 没有危险 请记住,NSNotificationCenter在内部使用该参数来决定某些事情。因此,如果您的代码依赖于以特定顺序或某些队列运行的内容,则可能会出现意外行为。

以下是NSNotificationCenter Class Reference的相关引用:

  

要将通知添加到操作队列的对象。

     

如果您传递nil,通知中心不会使用通知的发件人来决定是否将该块添加到操作队列。

建议您按预期使用userInfo ,但这并不危险。

答案 1 :(得分:2)

后者更灵活。虽然您现在可能不关心发件人,但这可能会改变。您可能稍后发现需要传递其他信息。

最好事先做好。第一次正确完成它不需要额外的努力,当你的需求发生变化时,必须返回并重构一堆代码需要付出很多努力(并且容易出错)。

另外,使用后一种方法意味着您的代码与在其他框架中完成的方式一致。一致性使代码更易于阅读和维护。你不必考虑,“在这种情况下,我得到了这里的对象,但在这种情况下我得到了它。”