如何过早取消 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”的主要内容,如果未能解决你的问题,请参考以下文章