来自Cordova iOS插件的后续回调不会触发

时间:2014-07-16 09:14:40

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

我遇到麻烦,从cordova插件(iOS版)中立即触发后续回调。 在XCode调试器中,我清楚地看到它跨越了

[self.commandDelegate sendPluginResult:pluginResult callbackId:monitoredRegions.callbackId];

几次(立即连续),每次都略有不同pluginResult。 这是由

触发的
[locationManager requestStateForRegion:region];

我不会(并且无法控制)。

问题是,在Javascript方面,回调只被触发一次。

什么(实际上并非如此)奇怪的是,如果我在回调中引入一些阻塞,如alert(),则回调会多次触发(如预期的那样)。这很酷,但我不需要应用中的任何alert()

如果我理解,commandDelegate应该处理线程和排队,但似乎它没有。问题是,每次调用sendPluginResult时如何触发JS回调。

非常感谢!

1 个答案:

答案 0 :(得分:25)

因此,问题不在于线程/排队。

事实证明,只有才能使用callbackId,除非告诉Cordova不要通过将callbackId设置为{CDVPluginResult.keepCallback来清除true 1}}。请注意keepCallback不是BOOL属性,因此您可能需要致电[pluginResult setKeepCallbackAsBool:YES];

CDVPluginResult* pluginResult = [sendPluginResult resultWithStatus:CDVCommandStatus_OK messageAsString:key];
[pluginResult setKeepCallbackAsBool:YES]; // here we tell Cordova not to cleanup the callback id after sendPluginResult()
[self.commandDelegate sendPluginResult:pluginResult callbackId:monitoredRegions.callbackId];

令人头疼的是,如果你在回调中引入了alert()这样的屏蔽通话,Cordova会让你连续多次sendPluginResult使用相同的callbackId

请注意,您可能需要sendPluginResult CDVPluginResult keepCallback falsecallbackId发布您不会{{1}}的{​​{1}}需要了。