0

applicationDidBecomeActive メソッドでサーバーからデータを取得しています。ネット接続が遅すぎると、アプリがクラッシュし続けます。この問題の処理方法がわかりません。ご協力をお願いいたします。よろしくお願いします。

NSString *post =[[NSString alloc] initWithFormat:@"=%@@=%@",myString,acMobileno];

    NSURL *url = [NSURL URLWithString:[NSString stringWithFormat:@"http:///?data=%@&no=%@",myString,acMobileno]];

    NSData *postData = [post dataUsingEncoding:NSASCIIStringEncoding allowLossyConversion:YES];
    NSString *postLength = [NSString stringWithFormat:@"%d", [postData length]];
    NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init];

    [request setURL:url];
    [request setHTTPMethod:@"POST"];
    [request setValue:postLength forHTTPHeaderField:@"Content-Length"];
    [request setHTTPBody:postData];

    NSError *error1 = [[NSError alloc] init];
    NSHTTPURLResponse *response = nil;
    NSData *urlData=[NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error1];
    NSString *string;
    if ([response statusCode] >=200 && [response statusCode] <300)
            {
            string = [[NSString alloc] initWithData:urlData encoding:NSMacOSRomanStringEncoding];

            }
4

2 に答える 2

1

おそらく、アプリケーションのデリゲート メソッドでの同期呼び出しが原因です。UI の読み込みに時間がかかりすぎています (インターネット接続が遅く、メイン スレッドで Web サービスを呼び出しているため)。そのため、OS は、応答しない UI が原因でアプリがハングしたと判断し、アプリ自体をクラッシュさせます。

デバッグ目的のためだけに、FirstViewControllerviewDidAppearメソッドで同じコードを試してください。そこではうまくいくはずです。その場合は、呼び出しを別の場所に変更する必要があります (また、できればバックグラウンド スレッドまたは非同期で)。

編集:ただし、他の場所で機能する場合は、よりスムーズなUXのためにバックグラウンドスレッドで非同期ORとして呼び出しを変更する必要があります.

于 2013-04-17T07:06:43.150 に答える
1

接続のダウンロードが開始されたためにクラッシュしている可能性がありますが、終了していないため、コンパイラーが if ステートメントを渡すことができるため、必然的に nilurlDataパラメーターが与えられます。

これを修正するには、エラーがあるかどうかを確認してから、ダウンロードの応答ヘッダーを確認する必要があります。また、ユーザー エクスペリエンスをブロックしないように、この操作をバックグラウンド スレッドで実行することをお勧めします。現時点では、ファイルのサイズとユーザーのダウンロード速度に応じて、アプリの起動が遅くなります。

NSError *error1 = nil;
NSHTTPURLResponse *response = nil;
NSData *urlData=[NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error1];
NSString *string = nil;
if (error != nil && ([response statusCode] >=200 && [response statusCode] <300)){ 
    string = [[NSString alloc] initWithData:urlData encoding:NSMacOSRomanStringEncoding];
}
else {
    NSLog(@"received error: %@", error.localizedDescription);
}

dispatch_asyncバックグラウンド スレッドの場合は、ステートメントで上記のコードを実行するか、-sendAsynchronousRequest:代わりに-sendSynchronousRequest.

または、@Viral が言ったように、リクエストに時間がかかりすぎて、UI が読み込まれる前に同期リクエストが終了しないためにアプリがハングしている可能性があります。

于 2013-04-17T07:02:44.327 に答える