如何与NSNotification一起发送字符串?

时间:2014-08-11 03:51:29

标签: objective-c phonegap-plugins cordova-plugins nsnotification

我正在尝试为phonegap / cordova编写一个插件,允许在通过电话中断时恢复音频。我正在使用AVAudioSesionInterruptionNotification,它运行良好。但是,我需要能够将一个字符串发送到我的事件处理程序,但我无法弄清楚如何。

我在这里设置一个事件监听器并从javascript层调用它:

- (void) startListeningForAudioSessionEvent:(CDVInvokedUrlCommand*)command{
     NSString* myImportantString = [command.arguments objectAtIndex:0];
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(onAudioSessionEvent:) name:AVAudioSessionInterruptionNotification object:nil];
}

我在这里处理这个事件:

- (void) onAudioSessionEvent:(NSNotification *)notification
{
    if([[notification.userInfo valueForKey:AVAudioSessionInterruptionTypeKey] isEqualToNumber:[NSNumber numberWithInt:AVAudioSessionInterruptionTypeEnded]]){        
        //do stuff using myImportantString
    }
}

无法弄清楚如何将myImportantString传递给onAudioSessionEvent。我知道Objective-C很少(因此我使用了cordova),所以请回复,好像你正在和孩子说话一样。谢谢!

顺便说一句,我只是想在这里找到的c​​ordova媒体插件上添加几种方法:https://github.com/apache/cordova-plugin-media/tree/master/src/ios

所以上面的代码是我的.m文件的全部减去这部分

@implementation CDVSound (extendedCDVSound)

2 个答案:

答案 0 :(得分:1)

像这样:

// near the top of MyController.m (above @implementation)
@interface  MyController ()

@property NSString *myImportantString;

@end

// inside the implementation
- (void) startListeningForAudioSessionEvent:(CDVInvokedUrlCommand*)command{
     self.myImportantString = [command.arguments objectAtIndex:0];
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(onAudioSessionEvent:) name:AVAudioSessionInterruptionNotification object:nil];
}

- (void) onAudioSessionEvent:(NSNotification *)notification
{
    if([[notification.userInfo valueForKey:AVAudioSessionInterruptionTypeKey] isEqualToNumber:[NSNumber numberWithInt:AVAudioSessionInterruptionTypeEnded]]){        
        //do stuff using self.myImportantString
    }
}

答案 1 :(得分:1)

使用基于块的API添加观察者可能更容易:

- (void) startListeningForAudioSessionEvent:(CDVInvokedUrlCommand*)command{
    NSString* myImportantString = [command.arguments objectAtIndex:0];
    id observer = [[NSNotificationCenter defaultCenter] addObserverForName:AVAudioSessionInterruptionNotification
                                                                    object:nil
                                                                     queue:nil
                                                                usingBlock:^(NSNotification *notification){
        if([[notification.userInfo valueForKey:AVAudioSessionInterruptionTypeKey] isEqualToNumber:[NSNumber numberWithInt:AVAudioSessionInterruptionTypeEnded]]){        
            //do stuff using myImportantString; you could even skip the use of that
            //temporary variable and directly use [command.arguments objectAtIndex:0],
            //assuming that command and command.arguments are immutable so that you
            //can rely on them still being the same
        }
    }];
}

通过使用基于块的API,您可以直接引用在发布通知时调用的代码中添加观察者时范围内的任何变量。

当您完成观察时,您需要删除observer作为通知的观察者。