2011-10-24 14 views
3

NSTimerを使用してメソッドを呼び出そうとしていますが、動作しません。 このメソッドは、ユーザーがカレンダーに設定した特定の日時に1回実行する必要があります。fireDateで初期化されたNSTimerが起動しない

私は私のviewDidLoad方法でこのコードを持っている:

NSDateComponents *comps = [[NSDateComponents alloc] init]; 

[comps setDay:24]; 
[comps setMonth:10]; 
[comps setYear:2011]; 

[comps setHour:23]; 
[comps setMinute:11]; 
[comps setSecond:0]; 


NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar]; 
NSDate *date = [gregorian dateFromComponents:comps]; 
schedulerTimer=[[NSTimer alloc] initWithFireDate:date interval:0 target:self selector:@selector(recordByScheduler:) userInfo:nil repeats:false]; 

しかし、このコードは何もしません。おそらく私は誤解したNSCalendarです。私はここで何をすべきですか?もう1つの質問:アプリケーションがバックグラウンドで実行されているときにNSTimerが起動しますか?

答えて

5

runloopでタイマーをスケジュールする必要があります。

[[NSRunLoop currentRunLoop] addTimer:schedulerTimer forMode:NSDefaultRunLoopMode]; 

または状況に応じて同様です。質問の編集へ

応答:アプリケーションがバックグラウンドで動作しているとき

んNSTimerが発射されていません。

2

アプリがバックグラウンドで一時停止されている場合、NSTimerは起動しません。あなたは必要なものに応じてUILocalNotificationを使うことができます。

+0

ニース。彼はアラームを設定しようとすると、実際には全くNSTimerを望んでいないされている可能性があり、私に起こったことはありません。 – NJones

0

@NJonesで回答を試みましたが、うまくいかなかった。ちょっとしたジャグリングで、私はでなくNSDefaultRunLoopModeでなく、mainRunLoopで使うべきだと分かった。例えば、

[[NSRunLoop mainRunLoop] addTimer:schedulerTimer forMode:NSRunLoopCommonModes]; 

それとも私が今使っスウィフト、

NSRunLoop.mainRunLoop().addTimer(schedulerTimer, forMode: NSRunLoopCommonModes) 

しかし、それはモードではなく、私の場合で働いてからそれを防ぐこと、ループを実行します。

ドキュメントでは、次の言葉:

NSDefaultRunLoopMode

NSConnectionオブジェクト以外の入力ソースに対応するためのモード。

これは最も一般的に使用される実行ループモードです。

iOS 2.0以降で使用できます。

NSRunLoopCommonModes

オブジェクトは、「共通」モードの組のメンバーとして宣言されたすべての実行ループモードによって監視されているモードとしてこの値を使用して実行ループに加え、CFRunLoopAddCommonModeの説明のための参照します詳細。

のiOS 2.0で利用可能

以降。

関連する問題