如何使用NSNotificationcenter的对象属性


72

有人可以告诉我如何在NSNotifcationCenter上使用对象属性。我希望能够使用它将整数值传递给我的选择器方法。

这就是我在UI视图中设置通知侦听器的方式。好像我要传递一个整数值,我不确定用nil替换什么。

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


- (void)receiveEvent:(NSNotification *)notification {
    // handle event
    NSLog(@"got event %@", notification);
}

我从另一个这样的类调度通知。该函数传递了一个名为index的变量。我想以某种方式触发此通知。

-(void) disptachFunction:(int) index
{
    int pass= (int)index;

    [[NSNotificationCenter defaultCenter] postNotificationName:@"myevent" object:pass];
    //[[NSNotificationCenter defaultCenter] postNotificationName:<#(NSString *)aName#>   object:<#(id)anObject#>
}

Answers:


105

object参数表示的通知时,其通常的发送者self

如果您希望传递额外的信息,则需要使用NSNotificationCenter方法postNotificationName:object:userInfo:,该方法采用任意值的字典(您可以自由定义)。内容必须是实际NSObject实例,而不是整数(例如整数),因此您需要将整数值与NSNumber对象包装在一起。

NSDictionary* dict = [NSDictionary dictionaryWithObject:
                         [NSNumber numberWithInt:index]
                      forKey:@"index"];

[[NSNotificationCenter defaultCenter] postNotificationName:@"myevent"
                                      object:self
                                      userInfo:dict];

我同意你的选择。我唯一要做的额外事情是在字典周围包装一个自动释放池。
dubbeat 2010年

3
(哦,我的解决方案与马修的解决方案相同,我只是设法单击“提交更快”!)
gavinb 2010年

1
当您说“在字典周围包裹一个自动释放池”时,是意味着您添加了一个自动释放字典的调用,还是创建了一个实际的NSAutoreleasePool对象?除非您在辅助线程上,否则不需要后者,并且对于这种形式的类初始化程序,前者不是必需的,因为它不是init也不是new。
gavinb 2010年

设置对象时,还应注意以下几点:“两种方法的名称和对象参数都用于确定发布的通知的条件是否与观察者匹配。如果设置了名称,则只有具有该名称的通知会触发,但是,如果设置了nil,则所有名称都将匹配。object的情况也是如此。因此,如果同时设置了name和object,则仅触发具有该名称和指定对象的通知。 ,那么所有发布的通知都会触发。” - nshipster.com/nsnotification-and-nsnotificationcenter
米哈伊Drpa

82

object属性不适用于该属性。相反,您想使用userinfo参数:

+ (id)notificationWithName:(NSString *)aName 
                    object:(id)anObject 
                  userInfo:(NSDictionary *)userInfo

userInfo 如您所见,NSDictionary是专门用于随通知一起发送信息的NSDictionary。

您的dispatchFunction方法将是这样的:

- (void) disptachFunction:(int) index {
    NSDictionary *userInfo = [NSDictionary dictionaryWithObject:[NSNumber numberWithInt:index] forKey:@"pass"];
   [[NSNotificationCenter defaultCenter] postNotificationName:@"myevent" object:nil userInfo:userInfo];
}

您的receiveEvent方法将如下所示:

- (void)receiveEvent:(NSNotification *)notification {
    int pass = [[[notification userInfo] valueForKey:@"pass"] intValue];
}

“对象属性不适用于此。” 为什么它不合适?无论如何,如果我尝试使用对象属性来传递(例如)NSString *。会发生什么?
Selvin 2013年

1
@Selvin用于发送发布通知的对象(self如果要使用它,则将其设置为)。如果在这里放其他东西会怎样?我不知道,但是如果我不得不猜测的话,它可能会使幕后的事情搞砸,例如Notification Center跟踪需要发布的内容。当有用于传递对象的实际系统时,为什么要冒险?
马修·弗雷德里克

3
“ NSNotification对象(称为通知)包含一个名称,一个对象和一个可选的字典。该名称是标识该通知的标签。该对象是该通知的发布者希望发送给该观察者的任何对象。通知-通常是发布通知本身的对象。词典可能包含有关事件的其他信息。” 听起来好像这将是完美的罚款投入比其他的东西selfnilobject:
最高

1
@mdorseif“通常是发布通知本身的对象”是为什么它不是最佳位置。通常,在此放置呼叫者。不会破坏任何东西,但是它是非标准的,那么为什么在有放置数据的完美场所时为什么要破坏呢?为什么要让未来的自我或其他可怜的灵魂想知道为什么调用者self不在其所属的对象中,而是不在其他随机数据中。
马修·弗雷德里克
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.