あなたはかなりそれを持っています。ただし、さらに読みたい場合や、何が起こっているのかについてより完全な説明が必要な場合は...
Apple Docs Grand Central Dispatch (GCD) Referenceを読んで、WWDC 2012 のビデオセッション 712 - Asynchronous Design Patters with Blocks, GCD and XPC をご覧ください。
iOS を使用している場合、XPC (プロセス間通信) は現在の OS バージョン (この記事の執筆時点では 6.1) でサポートされていないため、無視できます。
例:背景に大きな画像を読み込み、完成したら画像をセットする。
@interface MyClass ()
@property (strong) dispatch_block_t task;
@end
@implementation MyClass
- (void)viewDidLoad {
self.task = ^{
// Background Thread, i.e., your task
NSImage *image = [[NSImage alloc] initWithData:data];
dispatch_async(dispatch_get_main_queue(), ^{
// Main Thread, setting the loaded image
[view setImage:image];
});
});
}
- (IBAction)cancelTaskButtonClick:(id)sender { // This can be -viewWillDisappear
self.task = nil; // Cancels this enqueued item in default global queue
}
- (IBAction)runTaskButtonClick:(id)sender {
// Main Thread
dispatch_queue_t queue;
queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_async(queue, self.task);
}
後でインターフェイスをキャンセルしてリロードするには、dispatch_block_t 変数を nil に設定するだけです。
おそらくより具体的には、このコード例では、ディスクまたはネットワークからのデータの読み取りを扱います。
通常、基本的にバックグラウンド スレッドを取得し、タスクを実行し、完了時に別のブロックを呼び出してメイン スレッドを取得し、UI を更新する Call-Callback パターンを使用します。
お役に立てれば!