2016-11-11 11 views
0

私の仕事はすべてうまくいっていますが、少し問題があります。私はNSURLRequestを - (void)viewDidLoad {}持っており、サーバからデータを取得するのに時間がかかりました。私はそれが非同期の方法で行われることを望みます。Objective-Cで非同期的にAPIデータを取得するには?

以下は私のコードです。私は何を実装すべきですか? おかげさまで皆様に感謝します。 :)

- (void)viewDidLoad { 
[super viewDidLoad]; 
[[self tableView2]setDelegate:self ]; 
[[self tableView2]setDataSource:self]; 
array=[[NSMutableArray alloc]init]; 

NSString *castString = [NSString stringWithFormat:@"https://api.themoviedb.org/3/movie/%@/credits?api_key=c4bd81709e87b12e6c74a08609433c49",movieIDinString]; 
NSURL *url=[NSURL URLWithString:castString]; 

NSURLRequest *request=[NSURLRequest requestWithURL:url]; 
connection=[NSURLConnection connectionWithRequest:request delegate:self]; 
if (connection) 
{ 
    webData= [[NSMutableData alloc]init]; 
} 
+0

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT、0)、^(ボイド){ //バックグラウンドスレッド dispatch_async(dispatch_get_main_queue()、^(ボイド){// 実行UI更新 [_activityIndi​​catorImageView stopAnimating]。 }); }); –

+0

@SudheerKolasani Objective-Cの初心者であるので –

+0

これはバックグラウンドでurlをロードしてメインビューのテーブルビューをリロードするのは簡単です –

答えて

1

これを試してみてください。..

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^(void){ 
     //Background Thread 

     NSString *castString = [NSString stringWithFormat:@"https://api.themoviedb.org/3/movie/%@/credits?api_key=c4bd81709e87b12e6c74a08609433c49",movieIDinString]; 
     NSURL *url=[NSURL URLWithString:castString]; 

     NSURLRequest *request=[NSURLRequest requestWithURL:url]; 
     connection=[NSURLConnection connectionWithRequest:request delegate:self]; 
     if (connection) 
     { 
      webData= [[NSMutableData alloc]init]; 
     } 

     dispatch_async(dispatch_get_main_queue(), ^(void){ 
      //Run UI Updates 

// reload table view here 
      [_activityIndicatorImageView stopAnimating]; 
     }); 
    }); 
+0

私はそれをviewDidLoadで実行する必要がありますか? –

1

あなたがAPIを使用している場合、それはサーバーからデータをフェッチするために、ある程度の時間がかかります。このとき、バックグラウンドスレッドを使用し、メインスレッドでアクティビティインジケータを表示する必要があります。 APIからデータを取得した後、スレッドをメインスレッドに変更する必要があります。私の下のコードをチェックしてください。

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{ 
    // background thread 
    // code for API call 

    dispatch_async(dispatch_get_main_queue(), ^{ 
     // main thread 
    }); 
}); 

コールバックメソッドも使用できます。

[helperApi instaUserDetails:finderDetailsDataDict andCallback:^(id jsonResponse) { 
     dispatch_async(dispatch_get_main_queue(), ^{ 
      if ([[jsonResponse objectForKey:@"code"] intValue] == 200) { 

       userDetailsDict = [jsonResponse objectForKey:@"data"]; 

       mediaArray = [[[[jsonResponse objectForKey:@"data"] objectForKey:@"user"] objectForKey:@"media"] objectForKey:@"nodes"]; 
      } 
      [activityIndicator stopAnimating]; 
      [self createUI]; 
     }); 
    }]; 

NSURLConnectionは廃止されました。 NSURLSessionを使用してみてください。

0

お試しAFNeworkingこれは、非同期ダウンロード/アップロードのいくつかのオプションを補完ブロックで提供します。

関連する問題