dispatch_asyncでバックグラウンドタスク
GCD(Grand Central Dispatch)を使って, バックグラウンド処理を行います。
iOSでは, NSOperationを使った方法でも可能です。方法と挙動は似たようなものです。
dispatch_asyncを使うメリットとしては, 処理の記述にブロックが渡せるので, クラス同士の
データの受け渡しが簡単(closureのように使える訳ですはい)です
サンプル
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ // Background operations dispatch_async(dispatch_get_main_queue(), ^{ // Main Thread }); });
これだけです, dispatch_asyncを呼び出すだけです。Queueの設定とかありますけどね。
処理はブロックコードの中に書きます
プライオリティ
処理の優先順位を決めます
Name |
---|
DISPATCH_QUEUE_PRIORITY_HIGH |
DISPATCH_QUEUE_PRIORITY_DEFAULT |
DISPATCH_QUEUE_PRIORITY_LOW |
DISPATCH_QUEUE_PRIORITY_BACKGROUND |
上から順番にハイプライオリティです。
あくまでもQueue内ですので, メインスレッドとの順序ではなく, この中で実行していくタスクの優先順位です
UIなどを操作したい
バックグラウンド処理ですので, ブロック内でのコードからUIは操作できません
main-threadに返す方法は, dispatch_get_main_queueを呼び出します処理は, ブロックコードです。
バックグラウンドでの注意点
NSFileManager, Core DataのContextはmain-threadと同じインスタンスは利用できません。
NSFileManager *fm = [[NSFileManager alloc] init];
画像をバックグラウンドで外部から取得してメインスレッドでセットする
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ NSURL *url = [NSURL URLWithString:@"xxxxx"]; NSError *error = nil; NSData *data = [NSData dataWithContentsOfURL:url options:NSDataReadingUncached error:&error]; dispatch_async(dispatch_get_main_queue(), ^{ UIImage *img = [UIImage imageWithData:data]; }); });