三个20 tturl请求重新发送
我有一个REST服务,它使用每隔一秒过期的auth_令牌 经常当请求失败时,我想重新验证(我正在进行验证) ,然后在中重新发送相同的三个20 tturl请求重新发送,url,request,three20,Url,Request,Three20,我有一个REST服务,它使用每隔一秒过期的auth_令牌 经常当请求失败时,我想重新验证(我正在进行验证) ,然后在中重新发送相同的TTURLRequest 以下通用方式: - (void)request:(TTURLRequest*)request didFailLoadWithError: (NSError*)error { NSLog(@"error %@ %@ %@", [error localizedDescription], [error localizedFailur
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)。如果以前在请求中使用过响应实例,则此操作将失败