0

以下のメソッドで、completionHandler でデータ処理を行った場合、メイン スレッドがブロックされますか? つまり、completionHandler で実行される処理はメイン スレッドで実行されますか?それともバックグラウンド スレッドで実行されますか?

+ (void)sendAsynchronousRequest:(NSURLRequest *)request
                          queue:(NSOperationQueue*) queue
              completionHandler:(void (^)(NSURLResponse*, NSData*, NSError*)) handler NS_AVAILABLE(10_7, 5_0);
4

2 に答える 2

1

ドキュメントによるとqueue次のとおりです。

要求が完了または失敗したときにハンドラー ブロックがディスパッチされる操作キュー。

そこhandlerで行われます。特に、実際の URL 接続処理がどこで行われるかについては、いずれの方法でも保証されません。そのため、メイン スレッドで終了したい場合は、単に[NSOperationQueue mainQueue].

于 2013-02-07T23:30:16.500 に答える
0

サポートしているOSのバージョンによって異なります。ドキュメントによると、完了ハンドラ ブロックは NSOperationQueue で実行されます。

+(void)sendAsynchronousRequest:(NSURLRequest *)request
                      queue:(NSOperationQueue*) queue
          completionHandler:(void (^)(NSURLResponse*, NSData*, NSError*)) handler NS_AVAILABLE(10_7, 5_0);

NSOperationQueueドキュメントの数行下に、次の引用が表示されます。

通常、オペレーション キューは、オペレーションの実行に使用されるスレッドを提供します。OS X v10.6 以降では、オペレーション キューは libdispatch ライブラリ (グランド セントラル ディスパッチとも呼ばれます) を使用してオペレーションの実行を開始します。その結果、同時操作または非同時操作として指定されているかどうかに関係なく、操作は常に別のスレッドで実行されます。ただし、OS X v10.5 では、操作は isConcurrent メソッドが NO を返す場合にのみ、別のスレッドで実行されます。そのメソッドが YES を返す場合、操作オブジェクトは独自のスレッドを作成する (または何らかの非同期操作を開始する) ことが期待されます。キューはスレッドを提供しません。

注: iOS 4 以降では、操作キューは Grand Central Dispatch を使用して操作を実行します。iOS 4 より前では、非同時操作用に個別のスレッドを作成し、現在のスレッドから同時操作を起動します。同時操作と非同時操作の違いとその実行方法については、NSOperation クラス リファレンスを参照してください。

アプリが OSX v10.6 以降をサポートしている場合は、完了ハンドラーを別のスレッドで実行する必要があります。OS X v10.5 では、指定する必要があります。iOS の場合も GCD を使用しているため、iOS 4 以降では操作も別のスレッドで実行されます。それがトミーの反応よりも明確であることを願っています。

于 2013-02-08T03:16:17.903 に答える