1

如果花费超过 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 {
..
}

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

4

2 回答 2

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

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

于 2011-08-03T01:56:40.187 回答
1

不熟悉RestKit,但我首先想到的是,将调度选择器设置为调用验证方法而不是失败方法要好得多,让验证方法检查是否已收到有效响应定义的时间,如果没有,则取消请求等并调用失败。

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

于 2011-08-02T22:24:12.067 回答