1

別のスレッドでコードを実行する最良の方法は何ですか?

 NSInvocationOperation *operationToComplete = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(operationMethod) object:nil];
 NSOperationQueue *queueToStart=[[NSOperationQueue alloc] init];
 [queueToStart addOperation:operationToComplete];

 -(void) operationMethod
 {
   NSData *data = [NSURLConnection sendSynchronousRequest:request returningResponse:&_response error:&_error];
 }

また:

 NSURLConnection *conn = [[NSURLConnection alloc] initWithRequest:request
                                                            delegate:self];

私は2番目の方法を行ってきましたが、これに関して少し混乱しているか、別の方法を使用しています.

4

2 に答える 2

3

同期リクエストで操作キューを使用すると、呼び出したい同時リクエストが多数ある場合に特に役立ちます。操作キューを使用すると、同時操作を指定するだけでなく、実行する同時操作maxConcurrentOperationCountの数を制限するように指定することも簡単になります (実行できる操作の数が制限されているため、大量の操作を実行する場合は重要です)。特定のサーバーと同時に動作します)。

後者の例 withinitWithRequestは、メソッドが必要な場合に役立ちますNSURLConnectionDataDelegate(いくつかの理由のいずれかで、たとえば、進行状況ビューを更新したい、ストリーミング操作を実行したい、接続をキャンセルできるようにしたいなど)。 .

3 番目のアプローチは、initWithRequestアプローチを と結合することです。つまり、 を独自の でNSOperationQueueラップします。これにより、これら 2 つの手法が結合され、豊富なメソッド (キャンセル可能、進行状況の更新など) が提供され、操作キューの機能 (ネットワーク要求をキューに追加して、同時実行の程度を構成したり、操作間の依存関係を確立したりできるようになります。など)、優れたインターフェイスを提供します。このアプローチを適切に実装するには、いくつかの特異性があります (で使用する場合は、実行ループをスケジュール/作成する必要があります)。したがって、実装の詳細に迷わずにこの手法の豊富な機能を楽しみたい場合は、AFNetworkingなどのサードパーティ ライブラリを使用することをお勧めします。NSURLConnectionNSOperationNSURLConnectionDataDelegateNSURLConnectionNSOperationQueue

「どちらが最適か」という質問への回答としては、何をしようとしているのかによって異なります。すべてに長所と短所があるためです。しかし、私はベースNSOperationの.NSURLConnection


ところで、おそらく最初の例を単純化できます。

NSOperationQueue *queue = [[NSOperationQueue alloc] init];

[queue addOperationWithBlock:^{
    NSData *data = [NSURLConnection sendSynchronousRequest:request returningResponse:&_response error:&_error];
}];
于 2013-03-01T07:31:17.813 に答える
0

Grand Central Dispatch (GCD) を使用すると、コードをバックグラウンドで実行できます。これも簡単です。

    dispatch_async( dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
    });

また、NSURLConnection は、非同期と同期の 2 つの操作モードをサポートしています。どちらも個別のスレッドをまったく使用しません。

于 2013-03-01T06:56:32.443 に答える