2012-01-04 10 views
4
-(IBAction) webRequest; 
{ 
    response = [[NSMutableData alloc] init]; 
    NSMutableURLRequest *theRequest = [[NSMutableURLRequest alloc] 
           initWithURL: [NSURL URLWithString:kResourcesURL] 
           cachePolicy: NSURLRequestReloadIgnoringLocalCacheData 
           timeoutInterval: 10]; 
    [theRequest setValue:@"application/json" forHTTPHeaderField:@"accept"]; 
    [theRequest setValue:strToken forHTTPHeaderField:@"token"]; 

    //show network activity indicator 
    [UIApplication sharedApplication].networkActivityIndicatorVisible = YES; 

    response = [NSURLConnection sendSynchronousRequest:theRequest returningResponse:&urlresponse error:&nserror]; 
    NSString *strResponse = [[NSString alloc] initWithData:response encoding:NSUTF8StringEncoding]; 
    SBJsonParser *sbjasonparser = [[SBJsonParser alloc] init]; 
    arrResponse = [sbjasonparser objectWithString:strResponse error:nil]; 

    //hide network activity indicator 
    [UIApplication sharedApplication].networkActivityIndicatorVisible = NO; 
} 

私のコードに何か問題がありますか?または同期化された要求によって差異が生じますか? または、AcivityIndi​​catorビューを使用する必要がありますか?networkActivityIndi​​catorVisibleが機能しない(同期要求)

答えて

4

私は、ネットワークアクティビティインジケータがいくつかのビューのレイアウトを必要としていると考えています。つまり、表示されるときには、ある時点で[self setNeedsLayout]が送信されます。この方法ではレイアウトはすぐには発生しません。実行ループの最後にという実際のレイアウトが必要なレイアウトとして表示されます。あなたのケースでの問題は、実行要求がの場合に、の後に再びインジケータを非表示にするように、メインスレッドを同期要求でブロックすることです。

メインスレッドをブロックすることを避ける唯一の方法があります。メインスレッドの観点から非同期にします。できます

  • 非同期NSURLConnection APIを使用します。
  • バックグラウンドスレッドで同期NSURLConnection APIを使用します。
  • NSOperationQueueを使用して同期NSURLConnection APIを使用します。

考えられるのは、ネットワークアクティビティインジケータを表示し、ネットワーク要求を開始し、メインスレッドの実行ループをスピンさせ、要求が完了したときにインジケータを非表示にすることです。

+0

メインスレッドで同期ネットワーク要求(または時間のかかる作業)を実行しないでください。そのタスクが完了するまで、あなたのアプリは応答しません。これはユーザーエクスペリエンスが悪いだけでなく、OSが応答時間が長すぎるとアプリが終了することがあります。実際のネットワーク環境下でこの質問に示されている同期アプローチを試みるとすぐに、アプリケーションはロックされてクラッシュしたように見えます。 – Jonah

+0

@Jonah:nextviewのレイアウトが現在のリクエストに対する応答に完全に依存している場合はどうですか? – viral

+0

@codeCube: 'NSURLConnectionDelegate'メソッドを使うことができます。バックグラウンドスレッドまたは 'NSOperationQueue'ルートを選択した場合は、ビュー設定コードを呼び出すために' -performSelectorOnMainThread:withObject:waitUntilDone: 'を使用してください。 iOS 5専用のコードがあれば、ビュー構成を '+ sendAsynchronousRequest:queue:completionHandler:'の補完ブロックに入れてください。 – Costique

関連する問題