2011-02-10 9 views
0
self.timer = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(updateTimerDisplay) userInfo:nil repeats:YES]; 
[runLoop addTimer:self.timer forMode:NSRunLoopCommonModes]; 

このコードスニペットは、私のviewDidLoadメソッドからコピーされているので、メインスレッドから実行されます。ラベルを更新するメソッドを呼び出すだけです。NSTimer to label

私はこれを行うために自分のスレッドを持っている必要があると思っていましたが、私はそうしなかったことを知っていました。

しかし、私はNSRunLoopCommonModesを理解していません。それはなぜ機能するのですか?


、タイマーが、それは、ユーザが画面を保持している場合でも、タイマーを停止することはできませんので、テーブルビューと同じ画面上にある「デジタルカウンター」であるラベルを更新します。

ありがとうございました。

答えて

2

NSRunLoopはさまざまな入力モードで実行できます。モードは、現在のランループによってどのイベントが処理されるかを定義します。
例:現在のランループがイベントトラッキングモードの場合、モーダルイベントループのみを処理します。 (Mac上でNSScrollBarまたはNSSliderをドラッグするなど)

NSTimerをNSDefaultRunLoopModeにのみ追加すると、何かがモーダルイベントループを引き起こしても起動しません。 (Apple's documentationで詳細)

NSRunLoopCommonModesあなたがしなければならないように、複数のモードのための「エイリアス」です:

[[NSRunLoop currentRunLoop] addTimer:mRenderDurationTimer forMode:NSDefaultRunLoopMode]; 
[[NSRunLoop currentRunLoop] addTimer:mRenderDurationTimer forMode:NSModalPanelRunLoopMode]; 
[[NSRunLoop currentRunLoop] addTimer:mRenderDurationTimer forMode:NSEventTrackingRunLoopMode]; 
0

私はあなたが使用するSDKメソッドから派生したコード内でPSYBlockTimerを使用しますが、セレクタの代わりにブロックを呼び出します:

self.timer = [NSTimer scheduledTimerWithTimeInterval:1 repeats:NO usingBlock:^ (NSTimer *t) 
{ 
    // stuff that will get executed in a second 
}]; 
0

を使用すると、別のスレッドの下NSRunLoopのインスタンスにお時間を追加する場合は、スレッドのこのNSRunLoopのwhileループが必要です。

do { 
    [[NSRunLoop currentRunLoop] runUntilDate:[NSDate date]]; 
} while (bDone); 

通常、私は私のスレッド主な機能に上記のコードを追加し、事が行われたときに、スレッドが死ぬ行くと、スレッドの自動解放プールが解放されます。それは次のようになります。