用的NSTimer匿名函数/块?(NSTimer with anonymous function /

2019-07-20 01:45发布

我希望能够安排在未来三点小的事件,而无需编写每一个功能。 我怎样才能做到这一点使用NSTimer ? 我明白块便于匿名功能,但对它们进行内使用NSTimer如果是这样,怎么样?

[NSTimer scheduledTimerWithTimeInterval:gameInterval  
         target:self selector:@selector(/* I simply want to update a label here */) 
         userInfo:nil repeats:NO];

Answer 1:

实际上,你可以拨打:

 NSTimer.scheduledTimerWithTimeInterval(ti: NSTimeInterval, target: AnyObject, selector: #Selector, userInfo: AnyObject?, repeats: Bool) 

使用这样的:

 NSTimer.scheduledTimerWithTimeInterval(1, target: NSBlockOperation(block: {...}), selector: #selector(NSOperation.main), userInfo: nil, repeats: true) 



Answer 2:

您可以使用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. 

    });

希望这可以帮助。



Answer 3:

基于块的计时器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旧操作系统的版本,你应该使用其他的解决方案之一。



Answer 4:

@Peter鹏的回答Objective-C的版本:

_actionDelayTimer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:[NSBlockOperation blockOperationWithBlock:^{
    NSLog(@"Well this is useless.");
}] selector:@selector(main) userInfo:nil repeats:YES];


Answer 5:

这是很容易的,但它不包括在苹果公司的框架,尚未至少。

你可以写一个基于块的包装NSTimer使用自己,如GCD ,也可以使用现有的第三方库,像这样的: https://github.com/jivadevoe/NSTimer-Blocks 。



Answer 6:

我已经创建了巫婆的NSTimer一类能够与块使用它。

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



Answer 7:

作为2018年底,你这样做恰恰是这样的:

Timer.scheduledTimer(withTimeInterval: 0.25, repeats: true) { timer in
  print("no, seriously, this works on iPhone")
} 

这得益于@JohnnyC!

真正奇怪!



Answer 8:

我喜欢这个黑客@彼得 - 庞! BlockOperation是动态创建的,通过自己本身是由运行队列自己的计时器,并调用主选段上运行....很好!

更新了Swift 3

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



文章来源: NSTimer with anonymous function / block?