2012-01-05 2 views
2

バックグラウンドでメソッドを繰り返し呼び出すアプリケーションがあります。私はステップの下に、次のことで、これを実装:NSOperationQueueとDispatch Queueを繰り返しタスクを実行するNSThreadの代わりに使用

  1. は、バックグラウンドスレッドを作成し、
  2. は、スレッドのスリープ・メソッドと呼ばれる
  3. 、および
  4. 、作成されたスレッド上で、適切なメソッドを呼び出し、再び以前に呼び出されたと呼ばれます方法。以下は

は、私が使用するコードです:

- (void) applicationDidFinishLaunching:(NSNotification *)notification 
    [NSApplication detachDrawingThread:@selector(refreshUserIdPassword) toTarget:self withObject:nil]; 
} 

-(void)refreshUserIdPassword 
{ 
    [self getAllUserIdsPasswordsContinousely]; 
    [NSThread sleepForTimeInterval:180]; 
    [self refreshUserIdPassword]; 

} 

私はNSThreadは、バックグラウンドタスクを実行するための最良の方法ではないことを読んだことがある、とのようなココアで提供される他のクラスが存在する - NSOperationQueueとGCDは、非同期タスクを実行するためにNSThreadより優先されるべきです。だから私は上記の指定された機能を代替クラスを使って実装しようとしています。

問題がある - 私は これらのクラスを使用して非同期タスクを実行することができていますけれども、私はこれらのクラスを使用して(私の 場合のように)繰り返しのタスクを実行することができません。

誰かがこれについて少し光を当てて、私を正しい方向に導くことができますか?

+2

「NSDispatchQueue」という名前のクラスはありません。 Grand Central Dispatch(GCD)を考えているかもしれませんが、オブジェクト指向のAPIではなくCの関数APIを使用しています。 Mac OS X 10.6以降、「NSOperation」はGCDをフードの下で使用します。 –

+0

ありがとうRob ...私の質問の用語を修正しました。 – Devarshi

答えて

5

私はあなたが使用してスタックオーバーフロー(しゃれ意図)を取得すると思いますあなたが投稿したコード。 -refreshUserIdPassword無限に反復...

GCDの使用はどうですか?

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification 
{ 
    // Insert code here to initialize your application 
    dispatch_source_t timerSource = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)); 
    dispatch_source_set_timer(timerSource, dispatch_time(DISPATCH_TIME_NOW, 0), 180*NSEC_PER_SEC, 10*NSEC_PER_SEC); 
    dispatch_source_set_event_handler(timerSource, ^{ 
     [self getAllUserIdsPasswordsContinuously]; 
    }); 
    dispatch_resume(timerSource); 
    self.timer = timerSource; 
} 
3

あなたは間違った場所を探しています。あなたが言うように、NSOperationQueueはこのタイプのタスクには適していません。 NSTimerは、この問題に対するCocoaのソリューションです。

1

質問にもグランドセントラルディスパッチタグがあります:
定期的な間隔でバックグラウンドで何かを実行する必要がある場合は、dispatch_sourceタイマーを使用することもできます。
AppleはConcurrency Programing Guideで非常に広範な例を提供しています。

あなたがバックグラウンドスレッドを必要としない場合(paulbaileyが述べたように)、あなたはNSTimerを使用することができ、さらにはよりシンプル: NSObjectののperformSelector:withObject:afterDelay:

関連する問題