2012-03-15 16 views
0

私は自分のプロジェクトの1つを整理し、私が頻繁に再利用するソースの一部を単一のクラスで取り除きたいと思っていました。 このクラスはWebサービスへのリクエストを処理しますが、これまでのところはすべて問題ありません。自分のクラスにコードを抽出するまでは、これらのリクエストを呼び出しクラスのスレッドとコールバックで処理しました。今iOSスレッド - コールバックのベストプラクティス

I "ベストプラクティス" という質問があります:私は(簡体字)のような何かを私のコードで

を:

(void)foo{ 
    Helper *h =[[Helper alloc]init]; 
    [h doRequest]; 
} 

doRequestは(独自のクラスで)ネットワークのアクションを実行し、私が持っていますリクエストが終了するまで待つ。だから私はコールバックまたはこれのようなものが必要です。

私は単にdoRequest inclをスレッドする必要がありますか? waituntildone =はい?

ヘルパークラスのネットワーキングもスレッド化する必要がありますか?私はから返された値を処理できるように、それはそれのタスクを完了した後にdoRequestから呼び出し元のクラスにコールバックを取得するためのベストプラクティスは何

[NSThread detachNewThreadSelector:@selector(h doRequest) toTarget:self withObject:nil]; 

:それとも、このようなものの十分なスレッドのメソッドを呼び出すことですWebサービス?

ありがとうございます。

[self fooCompletion:^{ 
    // do something after doRequest is done 
}]; 

答えて

3

:情報を返す必要のあるヘルパースレッドの終わり。

[self performSelectorOnMainThread:@selector(infoFromService:) withObject:aDictionaryWithInfo waitUntilDone:NO]; 

- (void)infoFromService:(NSDictionary *)aDictionary { 
    //Process all the information and update UI 
} 

常に任意のUIは、情報がダウンロードされているどのくらいの数の更新たとえば、彼らはワーカースレッドの途中で起こる場合でも、更新のためにメインスレッドを使用してください。同じテクニックを使用して、メインスレッドに関連情報を呼び出します。

+0

うまくいくようです:) ありがとう –

2

私は個人的にperformSelectorOnMainThreadを呼び出す好む:withObject:waitUntilDone doRequestは要求が完了するまで、あなたがメソッドを呼び出すには

- (void)fooCompletion:(void (^)(void))completion { 
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 
     Helper *h =[[Helper alloc]init]; 
     [h doRequest]; 
     if (completion) { 
      dispatch_async(dispatch_get_main_queue(), ^{ 
       // doRequest is done 
       completion(); 
      }); 
     } 
    }); 
} 

を行うことができます返さない考える

ヨハネス

関連する問題