iOS Cordova:Cordova是否在多次调用objective-C插件时创建多个实例?

iOS Cordova:Cordova是否在多次调用objective-C插件时创建多个实例?,ios,cordova,plugins,cordova-plugins,Ios,Cordova,Plugins,Cordova Plugins,我正在开发基于Cordova的iOS混合应用程序。我们有一个Objective-C插件文件(MyPlugin.h和MyPlugin.m),它通常是CDVPlugin的一个子类 我们从如下的JavaScript文件中调用objective-C插件 cordova.exec(success, error, "MyPlugin", "callNativeActivity", args); 这里,success-success回调函数, 错误-错误回调函数 和args-参数数组 下面是本机插件方法签名

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

我们从如下的JavaScript文件中调用objective-C插件

cordova.exec(success, error, "MyPlugin", "callNativeActivity", args);
这里,success-success回调函数, 错误-错误回调函数 和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用于发送插件结果。但是,是否有可能将我的响应发送到错误的实例?

希望我的问题清楚!!如有任何建议,将不胜感激。

规范:

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

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

通过ID正确处理回调

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

  • 每次调用
    cordova.exec(…)
    时,都会生成一个回调ID
  • 应用程序映射到回调[ID]={成功,错误}
  • 您的本机代码调用onSuccess(ID),将调用success
  • 调用onSuccess或onError后,回调[ID]设置为null

在现实世界中,也可能有一些进度侦听器,但它们也应该使用正确的callback-ID。

感谢您添加了大量有用的信息!!正如你所说,一个插件只有一个实例。这意味着,当我多次调用插件时,每次都会调用相同的插件方法(在我的例子中,它是callNativeActivity:)(使用不同的回调ID)。那么,如果我在插件方法中进行一些耗时的操作或计算,该怎么办呢。下次从JavaScript调用插件时,它会被覆盖吗?希望我能澄清我的疑虑。我不理解你的问题。如果你自己写一个插件,它需要某种线程安全。不要在插件实例中存储变量,因为这些变量不会在所有请求中共享。您需要将所有内容存储在callback-ID的上下文中。