31

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

@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 timerWithTimeInterval: target: selector: userInfo: repeats: ]; しました [NSTimer scheduledTimerWithTimeInterval: target: selector:userInfo: repeats: ]; 、それは働いています。何が問題だったのtimerWithTimeInterval:ですか?私は私の最初の実装で何かを見逃していますか?前もって感謝します。

4

4 に答える 4

129

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ます。そうではありません。タイマーが実行ループに入るとすぐに呼び出されます。

于 2012-07-01T10:30:24.167 に答える
3

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

assert(Thread.isMainThread)
let timer = Timer.scheduledTimer(timeInterval: 3, target: self, selector: #selector(YourSelector), userInfo: nil, repeats: true)
于 2016-06-02T12:17:22.520 に答える
3

前の回答として、メインスレッドでスケジュールを示しましたが、assertを使用するのではなく、メインスレッドに配置します。

@objc func update() {
    ...
}

DispatchQueue.main.async {
            self.timer = Timer.scheduledTimer(timeInterval: 0.01, target: self, selector: #selector(self.update), userInfo: nil, repeats: true)
        }

また、非同期が望ましくない場合は、次のことを試してください。

let schedule = {
            self.timer = Timer.scheduledTimer(timeInterval: 0.01, target: self, selector: #selector(self.update), userInfo: nil, repeats: true)
        }

        if Thread.isMainThread {
            schedule()
        }
        else {
            DispatchQueue.main.sync {
                schedule()
            }
        }
于 2018-05-15T13:48:30.847 に答える
1

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

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

于 2012-06-15T21:46:19.653 に答える