Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
三个20 tturl请求重新发送_Url_Request_Three20 - Fatal编程技术网

三个20 tturl请求重新发送

三个20 tturl请求重新发送,url,request,three20,Url,Request,Three20,我有一个REST服务,它使用每隔一秒过期的auth_令牌 经常当请求失败时,我想重新验证(我正在进行验证) ,然后在中重新发送相同的TTURLRequest 以下通用方式: - (void)request:(TTURLRequest*)request didFailLoadWithError: (NSError*)error { NSLog(@"error %@ %@ %@", [error localizedDescription], [error localizedFailur

我有一个REST服务,它使用每隔一秒过期的auth_令牌 经常当请求失败时,我想重新验证(我正在进行验证) ,然后在中重新发送相同的
TTURLRequest
以下通用方式:

- (void)request:(TTURLRequest*)request didFailLoadWithError:
(NSError*)error {
       NSLog(@"error %@ %@ %@", [error localizedDescription], [error
localizedFailureReason], [error localizedRecoverySuggestion]
                 );


       if (numRetries == 0) {
               [self authenticateUser:nil];

               request.urlPath = [request.urlPath
stringByReplacingOccurrencesOfRegex:@"access_token=([\\w-]+)"
withString:[NSString stringWithFormat:@"access_token=%@",
accessToken]];

               NSLog(@"URL: %@", request.urlPath);
               [request   send];

               numRetries++;

       }

}
我的所有
TTURLRequest
s都使用使用此失败的同一委托 方法但由于某种原因,当我调用[请求发送]请求时 进入“加载”阶段,但似乎从未完成。 但是,如果我手动刷新(通过向下拖动表视图)它 从头开始重新生成
TTURLRequest
,似乎工作正常


“重新发送”此请求的正确方式是什么?

我最近遇到了同样的问题。我还没有深入研究Three20,以了解是否有意重试失败的请求,但我发现了问题和可靠(且简单)的修复方法

第二次调用[request send]后,TTURLRequest实例在完成加载之前被释放。如果查看Three20Network中的TTURLRequestModel.m,可以看到模型的最后一个请求(_loadingRequest)在新请求被保留之前被释放。如果最后一个请求恰好与新请求相同(与您的情况相同),则其保留计数将变为0,并将被解除锁定:

/////////////////////////////////////////////////////////////////////////////
- (void)requestDidStartLoad:(TTURLRequest*)request {
  [_loadingRequest release];
  _loadingRequest = [request retain];
  [self didStartLoad];
}
我通过子类化TTURLRequestModel.m并用以下内容覆盖此方法解决了此问题:

/////////////////////////////////////////////////////////////////////////////////
- (void)requestDidStartLoad:(TTURLRequest*)request {
  [request retain];
  [_loadingRequest release];
  _loadingRequest = request;
  [self didStartLoad];
}
这在我的测试中起到了作用,似乎不会对任何事情产生负面影响


注意:如果对请求的响应对象使用TTURLJSONResponse,则需要分配一个新实例并将其设置为request.response,然后再次调用send。如果查看extThree20JSON中的TTURLJSONResponse.m,您将看到processResponse方法断言(nil==\u rootObject)。如果以前在请求中使用过响应实例,则此操作将失败。

我最近遇到了相同的问题。我还没有深入研究Three20,以了解是否有意重试失败的请求,但我发现了问题和可靠(且简单)的修复方法

第二次调用[request send]后,TTURLRequest实例在完成加载之前被释放。如果查看Three20Network中的TTURLRequestModel.m,可以看到模型的最后一个请求(_loadingRequest)在新请求被保留之前被释放。如果最后一个请求恰好与新请求相同(与您的情况相同),则其保留计数将变为0,并将被解除锁定:

/////////////////////////////////////////////////////////////////////////////
- (void)requestDidStartLoad:(TTURLRequest*)request {
  [_loadingRequest release];
  _loadingRequest = [request retain];
  [self didStartLoad];
}
我通过子类化TTURLRequestModel.m并用以下内容覆盖此方法解决了此问题:

/////////////////////////////////////////////////////////////////////////////////
- (void)requestDidStartLoad:(TTURLRequest*)request {
  [request retain];
  [_loadingRequest release];
  _loadingRequest = request;
  [self didStartLoad];
}
这在我的测试中起到了作用,似乎不会对任何事情产生负面影响

注意:如果对请求的响应对象使用TTURLJSONResponse,则需要分配一个新实例并将其设置为request.response,然后再次调用send。如果查看extThree20JSON中的TTURLJSONResponse.m,您将看到processResponse方法断言(nil==\u rootObject)。如果以前在请求中使用过响应实例,则此操作将失败