NSOperationを用いる

色々聞かれる

  • isStartedなどで今処理中か、今実行中かなど色々聞かれる。
  • 参考 http://www.oomori.com/cocoafw/Foundation/NSOperation/index.html
  • それを返すためのフラグを色々用意しておく。
  • このフラグ、例えばinCencelとかはNSOperationを使う側でフラグをたてて、実行をキャンセルしたり制御できる。

start

  • 実行したい処理を書く
  • 実行処理の最初にキー値監視→NSOperationを使う側に通知されるようにする。
  • 実行処理の終了にキー値監視解除、isFinishedフラグなどをたてる。

NSOperationを使う側

NSOperationQueueを用意しておく。

NSOperation(を継承したサブクラス)を作成しキューに追加する。

キー値監視で終了時にobserveValueForKeyPathが呼ばれてくるので、処理結果で得たデータ等を保存する。

画面表示の変更などはperformSelectorOnMainThreadをつかって行う事。

画面の終了とかでキューをキャンセルする。

サンプルコード

@interface MovingOperation : NSOperation 
@end
@implementation MovingOperation
- (void)main
{
   for (int i=0;i<100;i++) {
       NSLog(@"count %d",i);
   }
}
@end

使う側は

NSOperationQueue *queue

を作っておいて

MovingOperation *op = [[[MovingOperation alloc]init]retain];
[queue addOperation:op];
[op release];
とするだけでよい。

NSThreadを用いる

detachNewThreadSelector で実行すれば良い。排他処理は自前でする必要有り。

dispatch_queue_tを使う。GCD

dispatch_queue_tを取得

キューを作る

dispatch_queue_tを作成 dispatch_queue_create(name, nil);
dispatch_queue_tを解放 dispatch_release(queue);

nameは[@"hoge" UTF8String];で指定。

実行

非同期処理 dispatch_async(queue, ^{});

でキューに実行したいblocksを入れる。

dispatch_get_main_queue();

mainキューを取得する。

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0) , ^{

});

スレッドをスリープさせる。

  [NSThread sleepForTimeInterval:30.0]; 

で30秒眠る

最終更新:2012年11月21日 19:37