2014-07-16 6 views
7

코드 삽입 플러그인 (iOS 버전)에서 후속 콜백을 즉시 실행하는 데 문제가 있습니다. 는 엑스 코드 디버거에서 나는 명확하게 pluginResult 약간 다른과 (즉시 연속)Cordova iOS 플러그인의 후속 콜백이 실행되지 않습니다.

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

여러 번 할 때마다 단계를 참조하십시오. 그렇게하지 (그리고 수 없습니다) 제어하는 ​​

[locationManager requestStateForRegion:region]; 

에 의해 트리거됩니다 그.

자바 스크립트 측면에서 문제는 콜백이 한 번만 실행된다는 것입니다.

이상한 점은 alert()과 같은 콜백에 차단 기능을 도입하면 예상대로 콜백이 여러 번 발생한다는 것입니다. 멋지지만 앱에는 alert()이 필요하지 않습니다.

내가 이해하면 commandDelegate은 스레딩과 큐잉을 처리해야하지만 그렇지 않은 것처럼 보입니다. 문제는 sendPluginResult이 호출 될 때마다 JS 콜백을 시작하는 방법입니다.

감사합니다.

답변

22

그래서 문제는 스레딩/큐잉이 아닙니다.

그것은 당신이 trueCDVPluginResult.keepCallback을 설정하여 callbackId 것을 정리를하지 코르도바에게 하지 않는 한 번만 callbackId 사용할 수 있습니다 밝혀졌다. keepCallbackBOOL 재산 아니라고주의, 그래서 당신은 호출 할 필요가 있습니다 [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() 같은 차단 호출을 소개하면, 코르도바는 연속 된 여러 만들 수 있도록하는 것입니다 일을 망쳐 놨어요 sendPluginResult은 동일 callbackId입니다.

false이 더 이상 필요하지 않은 callbackId을 해제하는 것입니다 keepCallback CDVPluginResultsendPluginResult해야 할 수도 있습니다 유의하십시오.

+0

setKeepCallback의 기능에 대해 설명해 주셔서 감사합니다. 나는이 시나리오에서 머리를 치고 있었다. – mpoisot

+0

'pluginResult.keepCallback = [NSNumber numberWithBool : YES];'단순히 작동하지 않았습니다. 나는 그것을 [pluginResult setKeepCallbackAsBool : YES];로 변경했으며 마술처럼 작동했습니다! – Solidak

관련 문제