NSNotification addObserver中的参数`object`是什么?

29

我的一个名为Message.m的类正在使用以下代码来发布一个带有对象sentObject的通知:

NSDictionary *sentObject = [NSDictionary dictionaryWithObjectsAndKeys:draftData.arr,@"data", nil];

//Post notification to inform a receiver to reload data     
[[NSNotificationCenter defaultCenter] postNotificationName:@"reloadDuringSave" object:self userInfo:sentObject];

DraftData.m将作为接收器捕获以下通知:

[[NSNotificationCenter defaultCenter] addObserver:self 
                                         selector:@selector(dataReloaded:) 
                                             name:@"reloadDuringSave" 
                                           object:nil];

用于发布通知时,userInfo 可以是 nil 或者是一个 对象 (例如本例中类型为NSDictionarysentObject)。

问题:

addObserver 方法的其他参数是什么?它们除了可以是 nil 之外,还可以是什么?

3个回答

54

在调用"addObserver:selector:name:object:"方法时,“object”参数是一个可选的过滤器。当发布通知时,您可以将对象设置为通知的发送者,并且仅会收到该发送者的事件通知。如果设置为“nil”,则会收到所有此类型的通知(无论是谁发送的)。


1
点赞,因为这个答案比我的更准确。虽然如果不需要过滤,我的方法也可以工作,但是userInfo参数真的是用于传递数据的。 - Scott Berrevoets
我该如何将“object”设置为发送者(在此示例中为Message.m,请参见我的更新的原帖)? - tranvutuan
4
当您发布通知时,必须使用与“object”参数相同的对象作为通知的发送对象,而不是该类的另一个对象。请注意,不只是该类的另一个对象。 - Thilo
2
是的,我明白我必须传递完全相同的对象来发布通知,但说实话,我不知道该怎么做 :( - tranvutuan
“可选过滤器”是一个很好的说法。苹果文档应该更好,更像这样。 - Donn Lee
显示剩余4条评论

4
您可以使用它来传递通知中的任何对象。收到通知的接收方将能够访问该对象。例如,您可以按照以下方式实现dataReloaded
- (void)dataReloaded:(NSNotification *)notification {

    NSLog(@"%@", notification.object); // this will log the object you passed in addObserver:selector:name:object:

}

当您希望在通知中传递数据,以便接收通知的人也可以使用这些数据时,它非常有用。


1
是的,我正在使用通知传递数据。在addObserver中,我将对象传递为nil。如果我不传递nil,我应该传递什么? - tranvutuan
如果您不需要dataReloaded中的数据,传递nil是完全可以的。如果您需要这些数据,则应传递包含这些数据的对象。 - Scott Berrevoets
实际上,我确实需要dataReload中的数据,但我不知道我必须传递什么给object - tranvutuan

4

对于任何对苹果文档感兴趣的人,下面是它的内容:

notificationSender

想要接收通知的观察者需要指定一个对象;只有由该对象发送的通知才会被传递给观察者。如果你传入nil,则通知中心不会使用通知的发送者来决定是否将其传递给观察者。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接