【问题标题】:How to prematurely cancel a request in RestKit and invoke 'didFailWithError'如何过早取消 RestKit 中的请求并调用“didFailWithError”
【发布时间】:2011-12-01 20:29:56
【问题描述】:

我在我的 Objective-C 项目中使用 RestKit,需要为调用我的服务指定大约 10 秒的超时时间。

看了一圈,RestKit 似乎不支持这个,所以我的计划是:

  • 发送我的请求时启动计时器
  • 加载数据时,禁用计时器

这是我的问题...

如果计时器方法触发,我需要取消请求并手动调用下面的方法。我不是 100% 确定如何实现这一目标。

my other question 中有一些上下文,显示了 RestKit 在我的项目中是如何实现的,以及它在这种情况下的作用。

非常感谢您在这方面给我的任何帮助。

- (void)objectLoader:(RKObjectLoader*)objectLoader didFailWithError:(NSError*)error { 
     NSLog(@"Hit error: %@", error); 
}

【问题讨论】:

    标签: objective-c xcode restkit


    【解决方案1】:

    在 RestKit 版本 0.20.x 中,您可以使用

    取消计划的请求
    [[RKObjectManager sharedManager]
        cancelAllObjectRequestOperationsWithMethod:RKRequestMethodAny
                               matchingPathPattern:YOUR_PATTERN];
    

    【讨论】:

      【解决方案2】:

      您可以使用 cancelRequestsWithDelegate: 选择器来实现所描述的工作流程。

      - (void)cancelAfterTimeout {
          [[[[RKObjectManager sharedManager] client] requestQueue] cancelRequestsWithDelegate:self];
          NSError *myError = [[[NSError alloc] initWithDomain:NSPOSIXErrorDomain
                  code:12345 userInfo:nil] autorelease];
          //feel free to customize the error code, domain and add userInfo when needed.
          [self handleRestKitError:myError];
      }
      

      但是,调用该委托错误处理程序可能会很棘手,但您可以通过创建新的、单独的错误处理程序来解决它,如下所示:

      - (void)handleRestKitError:(NSError*)error {
          //do something with the error
      }
      

      并修改 didFailWithError: 方法的主体:

      - (void)objectLoader:(RKObjectLoader*)objectLoader didFailWithError:(NSError*)error { 
           [self handleRestKitError:error] 
      }
      

      【讨论】:

      • 再次感谢 mja。当我将第一个方法添加到我的控制器时,我得到了接收器类型“RKClient”,例如消息没有声明带有选择器“requestQueue”的方法。我假设 cancelAfterTimeout 是定时器触发的选定方法?
      • 我不知道你为什么会得到这个错误。通过查看源代码,我可以在 RKClient.h 标头 (github.com/RestKit/RestKit/blob/master/Code/Network/RKClient.h) 中看到 requestQueue 属性。你使用最新版本的 RestKit 吗?是的,cancelAfterTimeout 是定时器触发时要发送的选择器。
      • 我使用的是 0.9(来自版本文件)
      • 你使用的是 GitHub 的版本吗?你能检查一下你的 RKClient.h 是否定义了 requestQueue 属性吗?
      • 文件略有不同,因为我大约一周前从网站下载了最新版本。我会尝试更新。
      【解决方案3】:

      你总是可以得到: [[RKObjectManager sharedManager].operationQueue cancelAllOperations]; 您的每个请求都会以错误 -999 结束(操作已取消)。您可以检查 error.code 并执行适当的操作。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-09-16
        • 2015-09-30
        • 2023-04-05
        • 2011-09-22
        • 1970-01-01
        • 1970-01-01
        • 2021-05-21
        相关资源
        最近更新 更多