I have troubles with firing immediately subsequent callbacks from a cordova plugin (an iOS one). In XCode debugger I clearly see it steps over
[self.commandDelegate sendPluginResult:pluginResult callbackId:monitoredRegions.callbackId];
several times (in immediate succession), each time with a slightly different pluginResult
.
That gets triggered by
[locationManager requestStateForRegion:region];
which I don't (and can't) control.
The problem is, on the Javascript side, the callback gets fired only once.
What's (actually not so) strange is that if I introduce some blocking in that callback, like alert()
, the callback gets fired several times (as expected). That's cool but I don't need any alert()
in the app.
If I understand it, the commandDelegate
should take care of threading and queueing, but it seems like it doesn't. The question is, how to get the JS callback fired each time sendPluginResult
gets called.
Many thanks!
So, the issue wasn't in threading/queueing.
It turned out that you are allowed to use a callbackId
only once unless you tell Cordova not to cleanup that callbackId
by setting CDVPluginResult.keepCallback
to true
. Pay attention that keepCallback
isn't a BOOL
property, so you may need to call [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];
What messes things up is that if you introduce a blocking call like alert()
in that callback, Cordova will let you make multiple successive sendPluginResult
with the same callbackId
.
Keep in mind that you may need to sendPluginResult
with a CDVPluginResult
which keepCallback
is false
to release the callbackId
that you don't need anymore.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With