如何过早取消 RestKit 中的请求并调用“didFailWithError”

Posted

技术标签:

【中文标题】如何过早取消 RestKit 中的请求并调用“didFailWithError”【英文标题】:How to prematurely cancel a request in RestKit and invoke '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); 

【问题讨论】:

【参考方案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 并执行适当的操作。

【讨论】:

以上是关于如何过早取消 RestKit 中的请求并调用“didFailWithError”的主要内容,如果未能解决你的问题,请参考以下文章

XCTests 过早取消

如何在 Restkit 中执行没有正文、url 参数的 PUT 请求并取回对象

restkit 0.20.0 中的请求超时

使用 RestKit 在 post 请求中寻求帮助

使用 Restkit 监控网络调用 IOS

如何在请求中使用 NSStrings 映射 NSArray (RESTKit)