4

私は非同期性に頭を悩ませようとしています。ディスパッチ、複数のスレッド、実行ループなど。

違いは何ですか:

1)指定されたメソッドでNSURLRequestとNSURLConnectionを作成し、それを実行して、デリゲートメソッド(didReceiveResponse、didReceiveData、connectionDidFinishLoadingなど)に応答します。

2)ブロックを作成してdispatch_asyncにしますか?

最初のメソッドでは、デリゲートメソッドにアクセスできるのは素晴らしいようです(ディスパッチを使用しているメソッドにもアクセスできますか?)。デリゲートメソッドの実行は、起動されたとき(またはそれに近いときに実行されますか?)

ブロック/ディスパッチ方式では、ブロックはスレッド内で同期的に処理されると思いますか?そして、結果を処理するためにメインスレッドに戻りますか?私が見ているサンプルコード:

    dispatch_async(kBgQueue, ^{
    NSData* data = [NSData dataWithContentsOfURL: 
      kLatestKivaLoansURL];
    [self performSelectorOnMainThread:@selector(fetchedData:) 
      withObject:data waitUntilDone:YES];
});

では、データを受信した後に「selfperformSelector ....」を実行しますか?(私が以前に同期的に意味したこと-おそらく間違った用語)。そして、ブロックの次の行は、メインスレッドに戻ります。

「waitUntilDone:YES」の目的は何ですか、またはなぜですか?それがない場合、メインスレッドではない他のことが起こる可能性があるためですか?

上記の最初の方法はまだメインスレッドでのみ実行されますか?

そして最後に、WebページへのJSONクエリの場合のそれぞれの長所と短所は何ですか?ある方法が他の方法よりも優れている点はありますか?

4

1 に答える 1

2

1)メインスレッドまたはNSOperationでNSURLConnectionを使用する場合、任意の時点でNSURLConnectionを停止し、その進行状況を追跡することを完全に制御できます。返されるのは、さまざまなことが起こったときにメソッドを委任することですが、座って何かが完了するのを待っているわけではありません。いつでも停止したい場合は、キャンセルして送信し、リリース(またはゼロ)して忘れることができます。

2)それでこれを見てください。メインスレッドでこの呼び出しを行った場合、成功または失敗するまで待機します。開始すると、成功または失敗するまで実行する必要があります。メインスレッドにある場合、これによりUIがブロックされます。それをブロックに入れて他のスレッドで実行すると、同じことが起こります。選択したスレッドは、メソッドが終了するまでブロックされます。結果を送信するために「self」を使用すると、selfが保持されます。したがって、selfがUIViewControllerと言えば、それをポップしても(削除されると考えて)、このメソッドが完了するまでそのままになり、天国で何が行われるかがわかります。この使用法は非常に危険であり、頻繁に機能する可能性がありますが、デバイスのinet接続が不安定な場合(たとえば)、壊滅的に失敗します。

まで待つのは、スレッドを同期することです。メソッドがメインスレッドで実行されたことを知りたい場合は、次に進む場合は、YESを使用します。メソッドをキューに入れたいだけで、(この場合のように)完了した場合は、NOを使用します。

メソッドは確かにメインスレッドにあります-このAppleはこのメソッドであなたに約束します。

3)JSON

私が知っているユーザーの大多数は、NSOperationsまたはブロックのNSURLConnectionsを使用しています。操作をキャンセルすることができます(接続がキャンセルされます)。そのため、何が起こっていても「戻る」ボタンを押すことができます。クエリが失敗した場合は、htmlステータスを確認できます(400または500エラーが発生しましたか?タイムアウトが発生しましたか?など)

githubにはオープンソースプロジェクトがあり、200行のコードはほとんどなく、操作を実行するためのエレガントで使いやすいヘルパークラスを提供します(デモコード付き):/NSOperation-WebFetches-MadeEasy。私は個人的にこのコードをまだストアにある8つ以上のアプリで使用し、大きな成功を収めています。1つのOperationsRunnerで同時に何百ものフェッチが実行されることが多く、アプリには同時にOperationsRunnersを実行する複数のクラスがあります。

NSOperationでJSONを処理すると、複数のコアを備えたデバイスで実際のスピードアップが得られます。

于 2012-11-17T18:11:50.527 に答える