2016-07-26 5 views
0

iOSの目的Cでのマルチスレッドに関する疑問があります。スレッドでは一度も作業していません.. 私のアプリでは、バックグラウンドでのみ実行する必要があるタスクが2つあります。 UIはフリーズしません。続いて は、コードスニペットで上記のコードでiOS目的のマルチスレッドC

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^(void){ 
      [self someFunctionCallinWebservice]; 
      dispatch_async(dispatch_get_main_queue(), ^(void){ 
       //UI Updates 
      }); 
     }); 

、機能:someFunctionCallinWebserviceは、私はAFNetworkingライブラリを使用していたためにWebサービスを呼び出します。 Webサービスで成功すれば、データをローカルに保存しています。私は

[manager POST:url parameters:parameter success:^(AFHTTPRequestOperation *operation, id responseObject){ 
[self functionToSaveData:someArray]; 
} 

はsomeFunctionCallinWebserviceがバックグラウンドで実行されているが、フォアグラウンドで実行されて[self functionToSaveData:someArray]ここ

、以下のようにサーバから送信されたデータを保存するために、成功のブロック内の関数を呼び出しています。バックグラウンドスレッドでもこのfunctionToSaveDataを持つべきですか?

バックグラウンドで関数を呼び出すと、その関数の関連するすべての機能(サーバーの呼び出し、データの取得、保存など)がバックグラウンドスレッドの権利に含まれている必要があります。もう1つのスレッドをもう一度作成する必要がありますか?

助けてください...

+0

UIクラスとのやりとりが必要になるまで*すべてバックグラウンドで実行できます。したがって、フェッチしてバックグラウンドで保存し、UIが完了したら更新するように微調整します。 – Droppy

答えて

2

はい、uが、それはすべての問題を作成しません背景スレッドでfunctionToSaveData関数を呼び出すことができますが、uが任意のUIの更新を(行いたい場合のように: - >リロードのtableView、ショーやいくつかのビューを非表示にする)その時はメインスレッドでそれをしなければなりません。さもなければあなたのUIに何の影響も与えません。

dispatch_async(dispatch_get_main_queue()) { 
     //Do any UI updates here  
     } 
1

マルチスレッドは、iOSがさまざまな種類のサポートを備えているため、大きく困難な課題です。私はあなたがAppleのThreading Programming Guideを読むことをお勧めします。

あなたが行っているような(インターネットからデータを取得している)タイプのアクションについては、自分自身でマルチスレッドを行う必要性を排除するiOS非同期API(URLSessionなど)を使用することをおすすめします。

あなたの具体的な質問に対する答えは、POST:parameters:success:操作が同期操作か非同期操作かによって異なり、実際にはfunctionToSaveData:の動作に依存します。 functionToSaveData:は残りのアプリケーションとデータを共有することを前提としているため、同期の問題を避けるためにメインスレッドで行うのが最善です。

関連する問題