0

NSURLConnection を使用して、大きなテキスト ファイルを返す Web サービスにいくつかの http 要求を作成しています。明らかに、これはメイン スレッドをブロックし、ラグが追加されるため、これをバックグラウンドで処理したいと考えています。ところで、この特定の仕事/状況を処理するサードパーティのフレームワークがあることは認識していますが、iOS でのマルチスレッドについて学ぶ必要があるため、これを自分でコーディングしています。

NSThread をデタッチするか、ブロックで NSURLConnection コードを GCD に渡すことができます。どちらの方法も最初は問題なく機能します (http 接続を確立して要求を送信するため)。問題は、サーバーからデータを取り戻す方法です。説明させてください....私のWebサービスがデータを送り返すと、私のアプリはNSURLConnectionDelegateプロトコルからのコールバックを介して通知されます。しかし、これが発生するまでに、切り離されたスレッドがターゲットメソッドを終了しているか、ブロックがすでに GCD によって処理されており、キューから外れています (使用したアプローチによって異なります)。基本的に、コールバックはアプリに気付かれません (もちろん、dispatch_main_queue を使用している場合を除きます)。

それぞれのケースでこれを解決するための「正しい」objective-cの方法は何ですか?

方向性をありがとう

4

2 に答える 2

2

ネットワーク コードでは、NSULRConnection で非同期メソッドを使用し、バックグラウンド キューに返されたデータを処理します。UI を変更し、メイン キューに入れる必要があるデータのみが (GCD を使用して) メイン キューにディスパッチされます。

NSOperationQueue *yourQueue = [[NSOperationQueue alloc] init];
[NSULRConnection sendAsynchronousRequest:yourRequest 
                                   queue:yourQueue 
                       completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) 
{
    // The code inside here gets processed once the url request completes ...
    // It happens in the background on "yourQueue".

    [self doSomeExpensiveDataProcessingWithData:data];

    dispatch_sync(dispatch_get_main_queue(), ^{
        // Update UI on the main thread and wait to continue processing the data
        [self updateUI];
    });

    [self doSomeMoreDataProcessing];

    dispatch_sync(dispatch_get_main_queue(), ^{
        // Update UI on the main thread and wait to continue processing the data
        [self finalUpdateOfUI];
    });
}];

ネットワーキング コードの例以外では、私は通常、設計パターンとして非同期コールバックを好みます。さまざまなコールバックを分離してテストすることが容易になり、さまざまなコールバック (エラー処理やデータ処理など) をさまざまなメソッドに分割して、それらのメソッド内により焦点を絞ったコードを提供します。

GCD は、別のスレッドで数行のコードをすばやく実行したり、一部の作業を非同期にディスパッチしたりするのに非常に適しています。

NSThread はほとんど使用されなくなりました。

于 2012-07-20T08:35:02.907 に答える
0

NSRunLoopの問題のように聞こえます...たとえば、これを読んでください...

http://www.sortedbits.com/nsurlconnection-in-its-own-thread/ http://www.cocoaintheshell.com/2011/04/nsurlconnection-synchronous-asynchronous/

... 詳細は Google ...

…どうしてこんな風にしたいの?NSURLConnection をそのまま (メイン スレッドで) 非同期に使用し、受信時にこれらのデータの重い処理をディスパッチするだけで十分です。つまり、NSURLConnection デリゲート メソッドはメイン スレッドで呼び出されますが、メイン スレッドをブロックしないようにデータ処理のみをディスパッチします。

于 2012-07-20T08:33:54.210 に答える