NSTimer与匿名函数/块?
我希望能够在未来安排三个小事件,而不必为每个事件写一个函数。 我如何使用NSTimer
来做到这一点? 我明白块促进匿名function,但可以在NSTimer
,如果是的话,如何?
[NSTimer scheduledTimerWithTimeInterval:gameInterval target:self selector:@selector(/* I simply want to update a label here */) userInfo:nil repeats:NO];
你实际上可以调用:
NSTimer.scheduledTimerWithTimeInterval(ti: NSTimeInterval, target: AnyObject, selector: #Selector, userInfo: AnyObject?, repeats: Bool)
你可以使用dispatch_after,如果你想实现类似NSTimer和阻止执行。
以下是相同的示例代码:
int64_t delayInSeconds = gameInterval; // Your Game Interval as mentioned above by you dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC); dispatch_after(popTime, dispatch_get_main_queue(), ^(void){ // Update your label here. });
希望这可以帮助。
一个基于块的计时器API存在于Cocoa (截至iOS 10+ / macOS 10.12+) – 这里是你如何在Swift 3中使用它:
Timer(timeInterval: gameInterval, repeats: false) { _ in print("herp derp") }
…或在Objective-C中:
[NSTimer scheduledTimerWithTimeInterval:gameInterval repeats:NO block:^(NSTimer *timer) { NSLog(@"herp derp"); }];
如果您需要定位iOS10之前的操作系统版本,macOS 12,tvOS 10,watchOS 3,则应该使用其他解决scheme之一。
Objective-C版本@Peter Peng的回答:
_actionDelayTimer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:[NSBlockOperation blockOperationWithBlock:^{ NSLog(@"Well this is useless."); }] selector:@selector(main) userInfo:nil repeats:YES];
这很容易,但它不包括在苹果的框架,至less还没有。
你可以自己为NSTimer
编写一个基于块的包装器,比如使用GCD ,或者你可以使用像这样的现有的第三方库: https : //github.com/jivadevoe/NSTimer-Blocks 。
我创build了NSTimer的一个类别女巫使它可以使用块。
我喜欢这个破解@Peter-Pang! BlockOperation是通过运行队列本身拥有的Timer自己创build的,并调用块上的主select器来运行它。
更新了Swift 3
Timer.scheduledTimer(timeInterval: 1, target: BlockOperation { // ... }, selector: #selector(Operation.main), userInfo: nil, repeats: false)