2012-06-15 8 views
28

私はプロジェクトで実装する前に、タイマーでテストアプリケーションを作成しました。 初めてタイマーを使用しました。 しかし、問題は私が[NSTimer timerWithTimeInterval: target: selector: userInfo: repeats: ];を使用してタイマーを実装したときです。動作しません。ここで は、私のコードです インターフェース:NSTimer timerWithTimeInterval:not working

@interface uialertViewController : UIViewController 
{ 

    NSTimer *timer; 
} 

-(void)displayAlert; 
-(void)hideandview; 
@end 

が実装:

@implementation uialertViewController 
- (void)viewDidLoad { 

    [self displayAlert]; 
    [super viewDidLoad]; 
} 


-(void)displayAlert{ 

    timer = [NSTimer timerWithTimeInterval:1 target:self selector:@selector(hideandview) userInfo:nil repeats:NO]; 

    alert = [[UIAlertView alloc] initWithTitle:@"testing" message:@"hi hi hi" delegate:nil cancelButtonTitle:@"continue" otherButtonTitles:nil]; 
    [alert show]; 




    [alert release]; 
    alert = nil; 

} 

-(void)hideandview{ 

    NSLog(@"triggered"); 

    [alert dismissWithClickedButtonIndex:0 animated:YES]; 

    [alert release]; 

    [self displayAlert]; 
} 

@end 

その後、私は[NSTimer scheduledTimerWithTimeInterval: target: selector:userInfo: repeats: ];[NSTimer timerWithTimeInterval: target: selector: userInfo: repeats: ];を変更し、それはに取り組んでいます。 timerWithTimeInterval:の問題は何ですか?私は最初の実装で何かを味わっていますか?前もって感謝します。

+0

timerWithTimeIntervalはタイマーを作成しますが、それを開始してスケジュールしません。私はthats唯一の違いだと思う – rooster117

+0

@ rooster117:私はタイマーの火のメソッドを呼び出す必要があります、私は正しいですか? –

+0

startTimerWithTimeIntervalを起動したいときは、うんうんだか、単に呼び出すだけです。いずれにせよ – rooster117

答えて

115

scheduledTimerWithTimeInterval:invocation:repeats:scheduledTimerWithTimeInterval:target:selector:userInfo:repeats:が自動的にあなたがそれらを自分で追加する必要はありませんことを意味し、NSRunLoopに追加されますタイマーを作成欠落していました。それらをNSRunLoopに追加することは、それらを発射させる原因です。

timerWithTimeInterval:invocation:repeats:

timerWithTimeInterval:target:selector:userInfo:repeats:は、あなたがこのようなコードで、手動で実行ループにタイマーを追加する必要があります。ここで

[[NSRunLoop mainRunLoop] addTimer:repeatingTimer forMode:NSDefaultRunLoopMode]; 

他の答えはあなた自身をfireを呼び出す必要があることを示唆しています。そうではありません - タイマーが実行ループに置かれるとすぐに呼び出されます。

+0

すばらしい説明!ありがとう! – kev

+2

スケジュールされた方法であっても、コマンドラインユーティリティで実行している場合は、少なくとも私の経験では、mainRunLoopを手動で追加する必要があります:[run run nsrunloop](http:// hackazach.net/code/2013/08/09/run-run-run-nsrunloop/) – jheld

+0

スケジュールされたTimerは、タイマーを起動することなくこの提案に完全に対応しました。ありがとうございます – hitme

1

2つの違いは、timerWithTimeIntervalメソッドが、まだ起動されていないNSTimerオブジェクトを返すことです。タイマーを起動するには、[timer fire];を使用する必要があります。一方、scheduledTimerWithTimeIntervalは、既に起動しているNSTimerを返します。

だから、あなたの最初の実装では、あなただけの[timer fire];

+4

私のポストを参照してください - '[timer fire]'はタイマーを "起動"しません。単にそのメソッドを直接呼び出します。タイマーを起動ループに追加する必要があります。 –

+1

うわー、私はそれを知らなかった、OPはあなたの答えを受け入れる必要があります。 –

+0

これは一度は動作しますが、連続プロセスでは@Joseph Humfreyコードを使用します。 – yazh

2

また、メインスレッドにタイマーを追加することもできます。

assert(Thread.isMainThread) 
let timer = Timer.scheduledTimer(timeInterval: 3, target: self, selector: #selector(YourSelector), userInfo: nil, repeats: true)