Javascript PhoneGap/Cordova回调错误-RestKit完成函数未在PhoneGap中执行

Javascript PhoneGap/Cordova回调错误-RestKit完成函数未在PhoneGap中执行,javascript,objective-c,ios,cordova,restkit,Javascript,Objective C,Ios,Cordova,Restkit,如果从RestKit回调中调用,PhoneGap回调似乎不起作用。我们已经通过删除RestKit调用验证了我们的PhoneGap回调逻辑工作正常(加上所有其他PhoneGap插件回调工作正常)。在下面的代码中,loader.onDidLoadResponse在RestKit调用完成时执行,但是,即使通过PhoneGap/Cordova回调行执行,javascript中相应的完成例程也不会执行。这就好像回调消失了。我们是否在上下文中做了一些错误的事情,或者我们如何编写RestKit或PhoneGa

如果从RestKit回调中调用,PhoneGap回调似乎不起作用。我们已经通过删除RestKit调用验证了我们的PhoneGap回调逻辑工作正常(加上所有其他PhoneGap插件回调工作正常)。在下面的代码中,loader.onDidLoadResponse在RestKit调用完成时执行,但是,即使通过PhoneGap/Cordova回调行执行,javascript中相应的完成例程也不会执行。这就好像回调消失了。我们是否在上下文中做了一些错误的事情,或者我们如何编写RestKit或PhoneGap异步逻辑

任何帮助都将不胜感激

-(void)GetRestJson:(NSMutableArray*)arguments withDict:(NSMutableDictionary*)options
{
    NSString* callbackID = [arguments pop];
    NSLog(@"%@",callbackID);
    NSString* url = [arguments objectAtIndex:0];
    NSString* sublocation = [arguments objectAtIndex:1];
    NSDictionary * args = [NSDictionary dictionaryWithObjectsAndKeys:
                           callbackID, @"callBackID",
                           self, @"thisObject",                           
                           nil];
    RKClient* client = [RKClient clientWithBaseURL:[RKURL URLWithString:url]];

// <---- RESTKIT CALL MADE (WORKS)
    [client get:sublocation usingBlock:^(RKRequest* loader)
     {
         loader.onDidLoadResponse = ^(RKResponse *response)     // <---- RESTKIT COMPLETION CALLED (WORKS)
         {
             NSString* result = [response bodyAsString];
             NSString * callbackID = [args objectForKey:@"callBackID"];
             id callingObject = [args objectForKey:@"thisObject"];

             CDVPluginResult* pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK
                                                               messageAsString: [result stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];
             [callingObject writeJavascript: [pluginResult toSuccessCallbackString:callbackID]];  // <---- PHONEGAP CALLBACK MADE (BROKEN --- DOESN'T ARRIVE BACK ON JS CALLBACK)

         };

         loader.onDidFailLoadWithError = ^(NSError *error)
         {
             NSString* result = [error description];
             NSLog(@"Loaded payload: %@", result);
             NSString * callbackID = [args objectForKey:@"callBackID"];
             id callingObject = [args objectForKey:@"thisObject"];
             CDVPluginResult* pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK
                                                               messageAsString: [result stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];
             [callingObject writeJavascript: [pluginResult toErrorCallbackString:callbackID]];
         };
     }];
}
-(void)GetRestJson:(NSMutableArray*)参数和dict:(NSMutableDictionary*)选项
{
NSString*callbackID=[arguments pop];
NSLog(@“%@”,callbackID);
NSString*url=[arguments objectAtIndex:0];
NSString*子位置=[arguments objectAtIndex:1];
NSDictionary*args=[NSDictionary Dictionary WithObjectsSandKeys:
callbackID,@“callbackID”,
self,@“thisObject”,
零];
RKClient*client=[RKClient clientWithBaseURL:[RKURL URLWithString:url]];

//两个模糊的错误阻止了RestKit完成函数的执行:

问题#1-PhoneGap 2.0.0/Cordova 2.0.0在异步回调逻辑中存在错误

PhoneGap回调逻辑有一个错误,它可以触发来自不同上下文的无关调用的回调函数。当从Javascript进行调用时,PhoneGap生成一个新的回调ID,将其添加到cordova.callbacks数组中,并将其传递给本机代码。一段时间后,当本机代码完成请求时,它将cts javascript调用callbackSuccess或callbackError函数。相应的回调处理程序从cordova.callbacks数组中查找回调属性,并执行原始调用者的完成函数。问题是每个页面或重新加载页面时,都会将callbackId计数器重置为零,而新的调用最终会重用相同的callbackId,即使本机代码尚未完成之前的请求。这可能发生在加载新页面或在锚标记中的空href重新加载时。从page1.html调用本机代码可能会触发page2.html上的完成例程,因为本机代码在桥的另一端没有更改的上下文

解决方案:用唯一标识符替换递增的callbackId,以确保只调用调用方的完成逻辑。我使用伪GUID生成器完成了此操作。修复方法如下:

在cordova.2.0.0.js和cordova.ios.js中替换此行

callbackId = service + cordova.callbackId++;    // BUG: incrementing callbackId's can call unrelated callback logic
用这条线

callbackId = service + ":" + 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {var r = Math.random()*16|0,v=c=='x'?r:r&0x3|0x8;return v.toString(16);}); // Generate unique callbackID with Pseudo-GUID
问题#2-由于锚定为空href而导致页面重新加载

调用页面使用带有空href=“”的锚定标记,导致当前页面重新加载和$(文档)。准备再次启动。重新加载将重置cordova.callbackId计数器和cordova.callbacks数组。新启动的.ready函数对本机代码进行新调用,并重用本机代码中已在使用但仍挂起的相同callbackId。RestKit调用完成后,PhoneGap/cordova将启动一个回调ID,指向一个现在与无关逻辑重复的条目


解决方案:如上所述修复callbackId逻辑可防止执行不相关的回调逻辑。解决方案的第二部分是从锚标记中删除href,或仅在div元素中使用onclick,以防止页面重新加载或导航到重用callbackId的新页面。

防止了两个模糊的错误RestKit完成函数从执行:

问题#1-PhoneGap 2.0.0/Cordova 2.0.0在异步回调逻辑中存在错误

PhoneGap回调逻辑有一个错误,它可以触发来自不同上下文的无关调用的回调函数。当从Javascript进行调用时,PhoneGap生成一个新的回调ID,将其添加到cordova.callbacks数组中,并将其传递给本机代码。一段时间后,当本机代码完成请求时,它将cts javascript调用callbackSuccess或callbackError函数。相应的回调处理程序从cordova.callbacks数组中查找回调属性,并执行原始调用者的完成函数。问题是每个页面或重新加载页面时,都会将callbackId计数器重置为零,而新的调用最终会重用相同的callbackId,即使本机代码尚未完成之前的请求。这可能发生在加载新页面或在锚标记中的空href重新加载时。从page1.html调用本机代码可能会触发page2.html上的完成例程,因为本机代码在桥的另一端没有更改的上下文

解决方案:用唯一标识符替换递增的callbackId,以确保只调用调用方的完成逻辑。我使用伪GUID生成器完成了此操作。修复方法如下:

在cordova.2.0.0.js和cordova.ios.js中替换此行

callbackId = service + cordova.callbackId++;    // BUG: incrementing callbackId's can call unrelated callback logic
用这条线

callbackId = service + ":" + 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {var r = Math.random()*16|0,v=c=='x'?r:r&0x3|0x8;return v.toString(16);}); // Generate unique callbackID with Pseudo-GUID
问题#2-由于锚定为空href而导致页面重新加载

调用页面使用带有空href=“”的锚定标记,导致当前页面重新加载和$(文档)。准备再次启动。重新加载将重置cordova.callbackId计数器和cordova.callbacks数组。新启动的.ready函数对本机代码进行新调用,并重用本机代码中已在使用但仍挂起的相同callbackId。RestKit调用完成后,PhoneGap/cordova将启动一个回调ID,指向一个现在与无关逻辑重复的条目

解决方案:修复c