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さらに重要なことは、オブジェクトに init メッセージを2 回送信していることです。これは意味がありません。

代わりに、リクエストとの接続を作成してからそれを作成する必要がありますstart

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

NSURLConnectionDelegate次に、接続がタイムアウトした後に起動する必要があるコールバックで、接続の失敗に対応しconnection:didFailWithError:ます。

于 2013-04-30T08:00:57.750 に答える