我有一个使用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
,似乎工作正常。
“重新发送”此请求的正确方法是什么?
答案 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)。如果先前已在请求中使用了响应实例,则此操作将失败。