在目标 c 中的委托方法上设置超时
Posted
技术标签:
【中文标题】在目标 c 中的委托方法上设置超时【英文标题】:Setting timeout on a delegate method in objective c 【发布时间】:2011-08-02 22:18:14 【问题描述】:如果服务器调用耗时超过 10 秒,我需要设置一个 NSTimer 对象来手动超时(Restkit 不支持)
这是我下面的代码。本质上,我的加载器类将使用 loadObjectsAtResourcePath 委托请求
如果需要超过 10 秒,我想调用 Restkit 在服务器遇到错误时调用的相同失败方法 (didFailWithError)
但我觉得我做错了,而且失败方法需要一个只在委托类中初始化的对象。
//CLASS FOR LOADING OBJECTS
-(void)getObjects
RKObjectManager *sharedManager = [RKObjectManager sharedManager];
// loads the object via delegate
[sharedManager loadObjectsAtResourcePath:self.resourcePath delegate:self];
//creates an error
NSError *error = [NSError errorWithDomain:@"world" code:200 userInfo:nil];
// Setting timeout here. goto failure
nTimer = [NSTimer scheduledTimerWithTimeInterval:10.0f target:self.delegate selector:@selector:(objectLoader:nil didFailWithError:error:) userInfo:nil repeats:NO];
// handles failure
- (void)objectLoader:(RKObjectLoader*)objectLoader didFailWithError:(NSError*)error
..
// handles success
- (void)objectLoader:(RKObjectLoader*)objectLoader didLoadObjects:(NSArray*)objects
..
这样做的正确方法是什么?
【问题讨论】:
【参考方案1】:在委托回调以外的方法中处理超时会更好。正如您所说,委托方法需要在类中创建的对象。而且您可能不想以完全相同的方式处理“真正的错误”和超时,对吧?例如,如果超时,您可能希望选择重试。
如果您确实希望超时和错误失败来做完全相同的事情,您仍然可以为此使用另一种方法:
-(void)getObjects
RKObjectManager *sharedManager = [RKObjectManager sharedManager];
// loads the object via delegate
[sharedManager loadObjectsAtResourcePath:self.resourcePath delegate:self];
//creates an error
NSError *error = [NSError errorWithDomain:@"world" code:200 userInfo:nil];
// Setting timeout here. goto failure
nTimer = [NSTimer scheduledTimerWithTimeInterval:10.0f target:self selector:@selector(didTimeout) userInfo:nil repeats:NO];
- (void)didTimeout
NSLog(@"Error");
// handles failure
- (void)objectLoader:(RKObjectLoader*)objectLoader didFailWithError:(NSError*)error
[self didTimeout];
// handles success
- (void)objectLoader:(RKObjectLoader*)objectLoader didLoadObjects:(NSArray*)objects
//don't forget to invalidate the time or else you'll get errors even when successful
[nTimer invalidate];
如有必要,您当然可以将其扩展为更灵活,但这似乎涵盖了您所要求的内容。
【讨论】:
【参考方案2】:不熟悉RestKit,但我首先想到的是,将调度选择器设置为调用验证方法而不是失败方法要好得多,让验证方法检查是否有有效响应在定义的时间内收到,如果没有,则取消请求等并调用失败。
虽然我不熟悉 RestKit,但我熟悉使用 NSURLRequests,并且我知道可以在发出请求以生成超时失败时定义超时 - 不知道这是否有帮助...
【讨论】:
以上是关于在目标 c 中的委托方法上设置超时的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 NSURLConnection (NSMutableRequest) 超时