背景スレッドでASIHTTPRequest / AFNETWORKINGから完了ブロックを実行できますか?
-
13-11-2019 - |
質問
私はこのような別のスレッドで同期的に私のASIHTTPRequestを起動します。
//inside this start method I create my ASIHTTPRequest and start it
dispatch_async(dispatch_get_global_queue(0, 0), ^{
[process start];
});
.
しかし、完成ブロックはメインスレッド上で起動されます。要求が開始されたのと同じスレッド内の完了ブロックの実行を続けることができますか?
これを解決するために思い付くことができる唯一のものは、ディスパッチキューを定義し、同じスレッド内の完了ブロックを手動で実行することで、作成されたキューへの参照を保持することです。しかし、それは直接それを解決するのではなく、コードの残りのディスパッチキューをリダイレクトする前にメインスレッドのほんのほんの少しの瞬間を合格するのではありません。
誰かがより良い解決策を持っていますか?
編集:AFNETWORKING完了ブロックについても同様です...
解決
OK、私自身の質問に答えるために: ASIHTTPRequestフレームワークは、別のスレッドで完了ブロックを開始するオプションはありません。 代わりにAFNetworkフレームワークを使用できます。ここでは、「 successcallbackqueue 」と呼ばれるあらゆる種類の財産に2つのプロパティがあり、 ' failurecallbackqueue '。成功および障害ブロックの実行を処理するには、事前定義された「 dispatch_queue_t_t 」を追加できます。
これが同じ問題を持つ他の人を助けることを願っています!
更新:例
. 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];
他のヒント
あなた自身の作成の定義されたキューを使ってみてください。その後(最後に完了したら、完了ブロックでは終了したら)信号を更新するためにグローバルキューに戻ることができます。