1

NSURLConnection initWithRequest用来从服务器获取一些数据。当服务器可用时,这可以正常工作。但是,当服务器不可用时,我的应用程序会挂起并完全无响应至少 40-50 秒。我尝试使用timeoutInterval, 以及计时器来取消请求。但是我的应用程序仍然挂起。

虽然我的应用程序挂起,但没有NSURLConnectionDelegate调用任何方法。被onTimeExpire调用但不做任何事情。一旦应用程序再次响应(50 秒后......),NSURLConnectionDelegate delegate方法就会被调用,一切都很好......

服务器是 ip 为 192.168.xx 的本地服务器,仅当服务器(和 csv)文件可用时,才会将数据下拉到应用程序。

我想在启动之前先做一个简单的检查NSURLConnection,看看服务器是否在线。但似乎无法解决如何做到这一点?有任何想法吗?

-(id) loadCSVByURL:(NSString *)urlString
{

// Create the request.
    NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:urlString] cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:30.0f];


    self.timer = [NSTimer scheduledTimerWithTimeInterval:20 //for testing..
                                             target:self
                                           selector:@selector(onTimeExpired)
                                           userInfo:nil
                                            repeats:NO];    

    (void)[self.connection  initWithRequest:request delegate:self];

    //THE APP HANGS HERE!!!
    return self;
}

-(void)onTimeExpired
{
    NSLog(@"cancelling connection now!");
    [self.connection cancel];
}
4

1 回答 1

2

您将超时设置为 20,但连接超时设置为 30。这意味着即使您的设置正确,计时器也会在不成功的连接失败之前触发。

更重要的是,您向connection对象发送了两次初始化消息。这根本不符合逻辑。

相反,您需要先创建与请求的连接,然后再创建start它。

self.connection = [[NSURLConnection alloc] 
                         initWithRequest:request delegate:self];
[connection start]; 

然后,您对连接超时后应该触发的NSURLConnectionDelegate回调中的连接失败做出反应。connection:didFailWithError:

于 2013-04-30T08:00:57.750 回答