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 thatcallbackId
by settingCDVPluginResult.keepCallback
totrue
. Pay attention thatkeepCallback
isn't aBOOL
property, so you may need to call[pluginResult setKeepCallbackAsBool:YES];
What messes things up is that if you introduce a blocking call like
alert()
in that callback, Cordova will let you make multiple successivesendPluginResult
with the samecallbackId
.Keep in mind that you may need to
sendPluginResult
with aCDVPluginResult
whichkeepCallback
isfalse
to release thecallbackId
that you don't need anymore.