的NSTimer timerWithTimeInterval:不工作的NSTimer timerWi

2019-06-17 09:45发布

我在我的项目实施前已经创建了一个计时器测试应用程序。 这是我第一次使用定时器。 但问题是,当我使用实施计时器[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: 难道我mising在我的第一个执行什么? 提前致谢。

Answer 1:

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自己。 你不 - 会尽快计时器已经提上一个运行循环调用。



Answer 2:

另外一个可能想确保在主线程上添加计时器。

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


Answer 3:

两者之间的区别是, timerWithTimeInterval方法返回NSTimer还没有被解雇的对象。 要解雇你必须使用计时器[timer fire]; 在另一方面, scheduledTimerWithTimeInterval返回NSTimer已经被解雇了。

所以,在你第一次实现你只是缺少[timer fire];



Answer 4:

正如前面的回答指出,主线程上日程,但不是使用断言,把它在主线程上:

@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()
            }
        }


文章来源: NSTimer timerWithTimeInterval: not working