2012-02-11 11 views
1

私のアプリはWebサービスに関する情報を更新する必要があります。この作業は別のスレッドで行う必要があります。私はViewControllerから単純に非同期の呼び出しをしたくありません。なぜなら、それらはスレッドを持つ他の多くの作業であるからです。バックグラウンドスレッドでコールバックを行うタスクをスワップする方法

すべての応答が受信されて実行される場合、別のスレッドはViewControllerでデリゲートを呼び出す必要があります。

私はいくつかのヒントと基本を実装する方法を教えてもらえますか?

答えて

0

NSOperationQueueを使用して、バックグラウンドスレッドで順序付けられた一連のタスクを実行できます。 Webサービスを更新してから順番にタスクを実行する場合は、NSURLConnectionを使用して更新を実行する新しいクラスを作成し、NSURLConnectionが終了したらNSOperationQueueを開始できます。

2

これはNSURLConnectionを使用して行うことができますが、コードはかなり複雑です。

バックグラウンドスレッドで非同期Webリクエストを作成するための簡単なクラスを作成しました。 https://github.com/nicklockwood/RequestQueue

jsdが提案したNSOperationQueue(NSOperationQueueで実際に使用することができます)と同様の方法で動作しますが、使用する方が簡単だと思います。ここで

は、あなたが私のクラスを使用して、ビューコントローラからのリクエストをするだろうかです:

NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://someurl?foo=bar"]]; 
[[RequestQueue mainQueue] addRequest:request completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) { 

    //do something with the response 

}]; 

それはブロックを使用しているので、あなたは、デリゲートメソッドを作成する必要はありません、あなたは自分の処理コードを置くことができますコールバックの中に直接(私は "応答で何かをする"というコメントを書いています)。

このコールバック内のコードはメインスレッドで呼び出されるため、そこでUIを更新することはできますが、バックグラウンドでダウンロードが完了した後、リクエストを実際に開始すると数秒後に呼び出されますデリゲートメソッドのように。

+1

+1を共有します。好奇心の理由から、MKNetworkKit/AFNetworking/ASIHTTPRequestを "再実装"したのはなぜですか?言い換えれば、あなたの実装をそれらと区別させるものは何ですか? – Till

+0

ASIは放棄されましたが、AFNはARCとMKNをサポートしていません...今まで聞いたことはありませんでした;-)そのほかに、彼らはすべて "キッチンシンク"ソリューションです - 私は大規模なフレームワークが好きではありませんすべて、私は、私がミックスして一致させることができる単一目的のライブラリを好む。 –

関連する問題