three20 TTURLRequest重新发送

时间:2010-10-04 22:23:53

标签: url request three20

我有一个使用auth_token的REST服务,每次都会过期 经常。当请求失败时,我想重新进行身份验证(我是 能够做到)然后重新发送相同的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都使用同一个使用此失败的委托 方法。但出于某种原因,当我打电话给[请求发送]请求时 进入“加载”阶段,但似乎永远不会完成。 但是,如果我进行手动刷新(通过向下拖动表视图)它 从头开始重新生成TTURLRequest,似乎工作正常。

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

1 个答案:

答案 0 :(得分:0)

我最近遇到了同样的问题。我没有深入探索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 == _rootObject)。如果先前已在请求中使用了响应实例,则此操作将失败。