在回调函数中调用Objective C方法

时间:2014-03-23 02:51:27

标签: ios objective-c c

我一直在使用Dragonmobile sdk和音频音响系统,尝试进行语音识别 - >文本到语音链。

这是我的代码:

(这里有语音识别部分)

- (void)recognizer:(SKRecognizer *)recognizer didFinishWithResults:{ 
...
SystemSoundID id = [self playSound:url2]; //playSound
    AudioServicesAddSystemSoundCompletion (
                                           id,
                                           NULL,
                                           NULL,
                                           detectSoundFinish,
                                           NULL
                                           );
...
}

- (void)performRecognition:(id)sender
{
    if (!recognizer){
        self.recognizer = [[SKRecognizer alloc] initWithType:SKDictationRecognizerType detection:SKLongEndOfSpeechDetection language:@"en_US" delegate:self];
    }
}

void detectSoundFinish ( SystemSoundID  ssID, void *clientData )
{
    printf("end\n");
    //I want to call performRecognition here, or an equivalent thing.
}

我是目标C的新手(甚至是C.我主要用Python编写代码),我理解回调函数不属于我的类。所以,我的问题是 1.有没有办法在回调函数中调用objc方法? 2.或者,一种从回调访问主类属性的方法? 我一整天都在搜索和尝试,但还没弄明白该怎么做。 谢谢!

1 个答案:

答案 0 :(得分:2)

您不能使用Objective-C函数作为C函数的回调。

你可以做的是使用最后一个参数,用于传递你想要的任何数据,将指针传递给你的类实例。

AudioServicesAddSystemSoundCompletion (id,
                                       NULL,
                                       NULL,
                                       MyAudioServicesSystemSoundCompletionProc,
                                       self);

并在C回调函数体内,将指针强制转换为类,并使用它!

void MyAudioServicesSystemSoundCompletionProc (SystemSoundID ssID, void *clientData);
{
    MyClass *obj = (MyClass*)clientData;
    // use obj in the normal Objective-C way!!!
}