在目标c中设置委托方法的超时

时间:2011-08-02 22:18:15

标签: iphone objective-c nsurlconnection nstimer restkit

我需要设置一个NSTimer对象来手动超时服务器调用,如果它超过10秒(在Restkit中不支持)

这是我的代码如下。本质上,我的loader类将使用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 {
..
}

这样做的正确方法是什么?

2 个答案:

答案 0 :(得分:2)

最好在委托回调以外的方法中处理超时。如您所说,委托方法需要在类中创建的对象。你可能不想以完全相同的方式处理“真正的错误”和超时,对吗?例如,如果超时,您可能需要再次尝试。

如果你确实想要超时并且错误地执行完全相同的操作,那么你可以使用另一种方法:

-(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];
}

如果有必要,您当然可以将其扩展为更灵活,但这似乎涵盖了您的要求。

答案 1 :(得分:1)

我不熟悉RestKit,但我想到的第一件事是将调度选择器设置为调用验证方法而不是失败方法会更好,让验证方法检查是否有有效的响应在规定的时间内收到,如果没有,则取消请求等,并拨打失败。

虽然我不熟悉RestKit,但我熟悉使用NSURLRequests,并且我知道在发出生成超时失败的请求时可以定义超时 - 不知道是否有帮助......