【问题标题】:three20 TTURLRequest resend三20 TTURLRequest 重发
【发布时间】:2010-10-04 22:23:53
【问题描述】:

我有一个使用 auth_token 的 REST 服务,该 auth_token 每隔一段时间就会过期 经常。当请求失败时,我想重新验证(我是 能够做到),然后在 以下通用方式:

- (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++;

       }

}

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

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

【问题讨论】:

    标签: url request three20


    【解决方案1】:

    我最近遇到了同样的问题。我对 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)。如果响应实例之前已在请求中使用,这将失败。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多