パッケージをビルドし、Web サービスに送信し、パッケージを取得して開き、nsdictionary を返すメソッドがあります。データを要求している間に HUD を表示するために、バックグラウンド キューで呼び出すにはどうすればよいですか?
3 に答える
次のように新しいスレッドを切り離すことができます
- (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
});
}
グランド セントラル ディスパッチ (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 を使用できます。それは、どの程度非同期にしたいかによって異なります。
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];
main
PS のメソッドで非同期操作を開始することはできませんNSOperation
。がmain
終了すると、その操作にリンクされたデリゲートは呼び出されません。実を言うと、実行ループまたは同時動作を処理する必要があります。
ここにそれらの使用方法に関するいくつかのリンクがあります。
- http://www.cimgf.com/2008/02/16/cocoa-tutorial-nsoperation-and-nsoperationqueue/
- https://developer.apple.com/cocoa/managingconcurrency.html
そして明らかにクラス参照NSOperation