NSNotificationCenter选择器是否包含NSNotification对象

时间:2015-07-23 13:14:02

标签: objective-c nsnotificationcenter nsnotifications nsnotification

我正在进行一些代码清理,并且想知道是否有一个官方或非官方标准,以下哪个选项应该更好。

基本问题是我必须做一些视图更改逻辑。应该在awakeFromNib和收到通知时调用此代码。为了防止两次写相同的代码,最好选择下面的选项。

// Option 1
- (void)receiveThemeChangeNotification:(NSNotification *)note {
        [self updateInterfaceWithTheme];
}

- (void)updateInterfaceWithTheme {
}

- (void)awakeFromNib {
        [self updateInterfaceWithTheme];
}


// Option 2
- (void)receiveThemeChangeNotification:(NSNotification *)note {
        [self updateInterfaceWithTheme];
}

- (void)awakeFromNib {
        [self receiveThemeChangeNotification:nil];
}


// Option 3
// Registered as the selector for the notification directly
- (void)updateInterfaceWithTheme {
}

- (void)awakeFromNib {
        [self updateInterfaceWithTheme];
}

2 个答案:

答案 0 :(得分:0)

答案非常简单:如果您想发送包含通知的一些数据(例如idplayerObjectnameanything),请使用NSNotification作为一个参数。

据我所知,您不需要任何参数,因为您不需要NSNotification中的任何内容。

selector与将其添加到按钮或其他任何内容相同。如果您需要知道谁是发件人,或者您需要在该通知中使用任何类型的信息 - 使用参数。否则你可以跳过它,有时候(比如在你的情况下,你称之为不必要的"桥接"功能),这是更好的选择。

答案 1 :(得分:0)

在您不使用note进行任何操作的情况下,我会使用选项1.还有一个选项:

-(void)registerMethod
{
    __block __weak id observer;

    __typeof__(self) __weak weakSelf = self;

    observer = [[NSNotificationCenter defaultCenter] addObserverForName:@"Name"
                                                      object:nil
                                                       queue:nil
                                                  usingBlock:^(NSNotification *note) {

                                                      if( nil != weakSelf )
                                                      {
                                                          [weakSelf updateInterfaceWithTheme];
                                                      }

                                                      [[NSNotificationCenter defaultCenter] removeObserver:observer];

                                                  }];
}

-(void)awakeFromNib
{
    [self updateInterfaceWithTheme];
}

- (void)updateInterfaceWithTheme
{

}