7

我正在从我的 iOS 应用程序调用 Web 服务,最多可能需要四分钟才能返回。我正在使用 RestKit 来调用和加载对象。我发现当请求需要很长时间时,我会在大约 60 秒后收到超时错误。我尝试将 timeoutInterval 设置为荒谬的数量,但它仍然在 ~60 之后超时。

RKObjectManager* objectManager = [RKObjectManager objectManagerWithBaseURL:HOSTNAME];

objectManager.client.requestQueue.showsNetworkActivityIndicatorWhenBusy = YES;
objectManager.client.disableCertificateValidation = YES;

//timeout
objectManager.client.timeoutInterval = 1000;

这是对服务的调用:

- (void)loadData 
{

NSString *uid = [self retrieveFromUserDefaults:@"login_preference"];
NSString *pwd = [self retrieveFromUserDefaults:@"password_preference"];

if([uid isEqualToString:@""] || [pwd isEqualToString:@""]){
    [self stopSpinner];
    [self enableUserInterface:YES];
    UIAlertView* alert = [[UIAlertView alloc] initWithTitle:@"Missing Settings" 
                                                    message:@"Please enter your login information in the settings."
                                                   delegate:nil 
                                          cancelButtonTitle:@"OK" otherButtonTitles:nil];
    [alert show];
    return;

}


RKObjectManager* objectManager = [RKObjectManager sharedManager];
NSDictionary *params = [NSDictionary dictionaryWithObjects: 
                        [NSArray arrayWithObjects:uid, pwd, nil] 
                                                   forKeys:[NSArray arrayWithObjects:@"uid", @"pwd", nil]]; 

// Load the object model via RestKit    
[objectManager loadObjectsAtResourcePath:[@"/synchData" appendQueryParams:params] delegate:self];

}

我正在后台线程中调用 Web 服务 - 该设计中是否存在可能导致问题的东西?我无法想象什么,比如 iOS 不允许后台线程运行超过 60 秒?我只是不知道是什么问题。

超时是从服务器获得响应所需的时间,还是从服务器获得整个响应所需的时间?我正在返回一个可能非常大的 json 响应 - 我需要在超时限制内返回整个内容,还是只需要在限制内从服务器获取任何响应?

4

3 回答 3

2

如果我理解您的问题,解决方案将是:

- (void)request:(RKRequest *)request didFailLoadWithError:(NSError *)error

因此,当您遇到超时间隔问题时,它将被此方法捕获。

于 2012-11-08T21:18:33.933 回答
0

我有一个类似的问题,委托方法requestDidTimeout:(RKRequest*)request永远不会被调用。无论我是在 RKRequest 还是 RKClient 上设置超时。

警告:在请求上设置超时时,我看到请求不遵守设置的超时,除非我也调用[requestObject createTimeOutTimer].

但是,我在您的实现中注意到的是,您使用 1000 表示 NSTimeInterval:您的意思是 1000 秒超时吗?如果您的意思是一秒 = 1000 毫秒,请更改为 1。

RestKit 的默认超时是 120 秒,所以很可能这是 NSURLConnection 超时。

于 2012-10-25T17:12:11.733 回答
0

长期以来,Restkit 库(版本 ~= .4)只支持timeoutInterval在一个地方添加。

/**
An optional timeout interval within which the request should be cancelled.
This is passed along to RKRequest if set.  If it isn't set, it will default
to RKRequest's default timeoutInterval.
*Default*: Falls through to RKRequest's timeoutInterval
*/
@property (nonatomic, assign) NSTimeInterval timeoutInterval;

在 RKResponseLoader.h

/**
The timeout interval, in seconds, to wait for a response to load.
The default value is 4 seconds.
@see [RKTestResponseLoader waitForResponse]
*/
@property (nonatomic, assign) NSTimeInterval timeout;
于 2018-05-14T20:16:23.070 回答