iOS Cordova:当一个objective-C插件被多次调用时,Cordova会创建多个实例吗?



我正在开发一个基于Cordova的iOS混合应用程序。我们有一个Objective-C插件文件(MyPlugin.h和MyPlugin.m),它通常是CDVPlugin的子类。

我们从JavaScript文件中调用objective-C插件,如下所示。

cordova.exec(success, error, "MyPlugin", "callNativeActivity", args);

这里,success- success回调函数,error-错误回调函数and args-参数数组

下面是本地插件方法签名。

-(void)callNativeActivity:(CDVInvokedUrlCommand *)cdvCommand;

我们正在插件类中异步启动一个NSURLConnection任务。因此,它将等待来自web服务器的响应。响应出现后,我们将其作为CDVPluginResult对象发送回JavaScript。

if (isSuccess) {
        CDVPluginResult *result = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsDictionary:jsonPayload];
        [self.commandDelegate sendPluginResult:result callbackId:cdvCommand.callbackId];
}else{            
        CDVPluginResult *result = [CDVPluginResult resultWithStatus:CDVCommandStatus_ERROR messageAsDictionary:jsonPayload];
        [self.commandDelegate sendPluginResult:result callbackId:cdvCommand.callbackId];
}

在少数情况下,我们需要从JavaScript同时调用插件多次(不等待插件类的响应)。

如果我们多次调用它,Cordova会如何处理?它会扰乱我发回给JavaScript的响应吗?我知道Cordova有不同的回调ID来发送插件结果。但是,我的响应是否有可能被发送到错误的实例?

希望我的问题是清楚的!!

From specs Plugin Initialization and Lifetime:

每个插件对象的生命周期只创建一个实例UIWebView。插件通常在第一次引用时实例化通过JavaScript调用。否则,它们可以通过实例化在config.xml文件中设置onload参数为true

这意味着每个CordovaApp/WebView只有一个插件实例。

回调由ID正确处理。

它像这样工作(不确定真正的实现):

  • 每次呼叫cordova.exec(...),生成一个回叫id。
  • 应用程序映射回调[ID]= {success, error}
  • 你的本地代码调用onSuccess(ID),成功将被调用
  • 调用onSuccess或onError后,回调[ID]被设置为null

在现实世界中,也可以有某种进度侦听器,但它们也应该使用正确的回调id。

最新更新