在目标 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 中的委托方法上设置超时的主要内容,如果未能解决你的问题,请参考以下文章

如何设置socket的Connect超时

如何使用 NSURLConnection (NSMutableRequest) 超时

从 C# winforms 执行批处理文件忽略超时

如何在 TableViewCell 类中的 TextField 委托方法上获取单元格索引

CURL超时时间设置

C#中的委托和事件(续)