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的一个类别女巫使它可以使用块。

https://github.com/mBrissman/NSTimer-Block

我喜欢这个破解@Peter-Pang! BlockOperation是通过运行队列本身拥有的Timer自己创build的,并调用块上的主select器来运行它。

更新了Swift 3

Timer.scheduledTimer(timeInterval: 1, target: BlockOperation { // ... }, selector: #selector(Operation.main), userInfo: nil, repeats: false)