2

パッケージをビルドし、Web サービスに送信し、パッケージを取得して開き、nsdictionary を返すメソッドがあります。データを要求している間に HUD を表示するために、バックグラウンド キューで呼び出すにはどうすればよいですか?

4

3 に答える 3

2

次のように新しいスレッドを切り離すことができます

- (void) fetchData
{
     //Show Hud

    //Start thread
    [NSThread detachNewThreadSelector:@selector(getDataThreaded) 
    toTarget:self  
    withObject:nil];
}

- (void) getDataThreaded
{    
   //Start Fetching data

   //Hide hud from main UI thread
   dispatch_async(dispatch_get_main_queue(), ^{
        //Update UI if you have to
        //Hide Hud
    });
}
于 2012-06-06T18:41:15.187 に答える
0

グランド セントラル ディスパッチ (gcd) は、ユーザーの要求を実行するための優れたサポートを提供します。gcd を使用してバックグラウンドで何かを実行するのは簡単です。

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_NORMAL, 0) ^{
   NSDictionary* data = [self fetchAndParseData];

   dispatch_async(dispatch_get_main_queue(), ^{
      [self dataRetrieved:data];
   });
});

この呼び出しはすぐに返され (そのため、UI は応答し続けます) dataRetrieved、データの準備ができたときに呼び出されます。

現在、fetchAndParse データの動作方法によっては、より複雑にする必要がある場合があります。NSURLConnection などの場合、gcd スレッドでデータ コールバックを処理するために NSRunLoop を作成する必要がある場合があります。とにかく、大部分の NSURLConnection は非同期です (ただし、didReceiveData のようなコールバックは UI スレッドを介してルーティングされます)。そのため、すべてのデータが取得されたときにデータの解析を行うためにのみ gcd を使用できます。それは、どの程度非同期にしたいかによって異なります。

于 2012-06-06T19:28:42.993 に答える
0

NSOperation以前の回答に加えて、 andNSOperationQueueクラスを使用しませんか? これらのクラスは GCD の抽象化であり、非常に簡単に使用できます。

NSOperation私が普段開発しているアプリのコードをモジュール化できるので、クラスが好きです。

をセットアップするには、次のNSOperationようにサブクラス化できます

//.h
@interface MyOperation : NSOperation

@end

//.m
@implementation MyOperation()

// override the main method to perform the operation in a different thread...
- (void)main
{
    // long running operation here...
}

メインスレッドでは、次のようにその操作をキューに提供できます。

MyOperation *op = [[MyOperation alloc] initWithDocument:[self document]];
[[self someQueue] addOperation:op];

mainPS のメソッドで非同期操作を開始することはできませんNSOperation。がmain終了すると、その操作にリンクされたデリゲートは呼び出されません。実を言うと、実行ループまたは同時動作を処理する必要があります。

ここにそれらの使用方法に関するいくつかのリンクがあります。

そして明らかにクラス参照NSOperation

于 2012-06-16T14:25:40.553 に答える