2012-02-27 5 views
4

私はこのような別のスレッドで同期私のASIHTTPrequestを開始します。バックグラウンドスレッドのASIHTTPRequest/AFNetworkingからcompletionBlockを実行できますか?

//inside this start method I create my ASIHTTPRequest and start it 
dispatch_async(dispatch_get_global_queue(0, 0), ^{ 
    [process start]; 
}); 

しかしcompletionBlockはまだメインスレッド上で起動されます。 要求が開始された場所と同じスレッドでcompletionBlockの実行を維持できますか?

これを解決するために私が思いつくことができるのは、ディスパッチキューを定義して、手動でcompletionBlockを同じスレッドで実行して、作成されたキューへの参照を保持することです。しかし、それは、コードの残りを作成されたディスパッチキューにリダイレクトする前に、メインスレッドで気をつけている小さな瞬間を渡すため、直接解決できません。

誰かがより良い解決策を持っていますか?

EDIT:同じことが...またAFNetworking終了ブロックについても同様です

答えて

4

私自身の質問に答えるには ASIHTTPRequestフレームワークには、別のスレッドで完了ブロックを開始するオプションがありません。

代わりに、AFNetworkフレームワークを使用できます。ここには、「successCallbackQueue」と「failureCallbackQueue」という2種類のAFOperationのプロパティがあります。ここでは、定義済みの 'dispatch_queue_t'を追加して、成功ブロックと失敗ブロックの実行を処理できます。

これは同じ問題を持つ他の人に役立つことを願っています!

UPDATE:例

dispatch_queue_t requestQueue = dispatch_queue_create("requestQueue", NULL); 
AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:yourRequest]; 
operation.successCallbackQueue = requestQueue; 
operation.failureCallbackQueue = requestQueue; 
[operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) { 
    // add code for completion 
} failure:^(AFHTTPRequestOperation *operation, NSError *error) { 
    // add code for failure 
}]; 
[operation start]; 
+0

この例を投稿してもよろしいですか?私は同じことに苦労していますが、私はObj-Cに堪能ではなく、あなたのソリューションを実装する方法を理解していません。ありがとう! – Julian

+1

例を使って答えを更新しました。もはやそれを必要としないときにrequestQueueを解放するようにしてください。インスタンス変数を作成し、それをdispatch_release(requestQueue)で解放する方が良いです。 – Yannick

+0

AFHTTPRequestOperationはこれらのプロパティを持っていないようです...今は "completionQueue" – shim

0

あなた自身の創造の定義されたキューを使用してみてください。次に、完了ブロックで最後に終了した後に、グローバルキューに戻って、必要なディスプレイを更新することができます。

+0

あなたがグローバルキューで何を意味するのですか? – Yannick

+0

申し訳ありません - 実際は私は 'dispatch_get_main_queue'を意味していました。 Appleからの素晴らしいビデオがあります:「セッション308 - ブロックとGrand Central Dispatch in Practice」です。私が言及しているパターンは30:28頃です。あなたがAppleの開発者であれば無料です。 :) –

+0

あなたが何を意味していたかわかりましたので、私はあなたがここで探しているものではないことを伝える必要があります。このASIHTTPRequestの完了後、completionBlockのコードは自動的に "dispatch_get_main_queue"で呼び出されます。私はそれをしないことを試みている;)。私は、呼び出しが開始された同じスレッドで実行し続けたいと思っています... – Yannick

関連する問題