我希望能够安排在未来三点小的事件,而无需编写每一个功能。 我怎样才能做到这一点使用NSTimer
? 我明白块便于匿名功能,但对它们进行内使用NSTimer
如果是这样,怎么样?
[NSTimer scheduledTimerWithTimeInterval:gameInterval
target:self selector:@selector(/* I simply want to update a label here */)
userInfo:nil repeats:NO];
您可以使用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可可存在 (如iOS版10+ / MacOS的10.12+的) -这里是你如何在斯威夫特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旧操作系统的版本,你应该使用其他的解决方案之一。
@Peter鹏的回答Objective-C的版本:
_actionDelayTimer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:[NSBlockOperation blockOperationWithBlock:^{
NSLog(@"Well this is useless.");
}] selector:@selector(main) userInfo:nil repeats:YES];
这是很容易的,但它不包括在苹果公司的框架,尚未至少。
你可以写一个基于块的包装NSTimer
使用自己,如GCD ,也可以使用现有的第三方库,像这样的: https://github.com/jivadevoe/NSTimer-Blocks 。
我已经创建了巫婆的NSTimer一类能够与块使用它。
https://github.com/mBrissman/NSTimer-Block
作为2018年底,你这样做恰恰是这样的:
Timer.scheduledTimer(withTimeInterval: 0.25, repeats: true) { timer in
print("no, seriously, this works on iPhone")
}
这得益于@JohnnyC!
真正奇怪!
我喜欢这个黑客@彼得 - 庞! BlockOperation是动态创建的,通过自己本身是由运行队列自己的计时器,并调用主选段上运行....很好!
更新了Swift 3
Timer.scheduledTimer(timeInterval: 1, target: BlockOperation { // ... }, selector: #selector(Operation.main), userInfo: nil, repeats: false)