NSTimer с анонимной функцией/блоком?
Я хочу иметь возможность планировать три небольших события в будущем без необходимости писать функцию для каждого. Как это сделать, используя NSTimer
? Я понимаю, что блоки облегчают анонимные функции, но могут ли они использоваться в NSTimer
, и если да, то как?
[NSTimer scheduledTimerWithTimeInterval:gameInterval
target:self selector:@selector(/* I simply want to update a label here */)
userInfo:nil repeats:NO];
Ответы
Ответ 1
Вы действительно можете позвонить:
NSTimer.scheduledTimerWithTimeInterval(ti: NSTimeInterval,
target: AnyObject,
selector: #Selector,
userInfo: AnyObject?,
repeats: Bool)
Ответ 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.
});
Надеюсь, что это поможет.
Ответ 3
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, вы должны использовать одно из других решений.
Ответ 4
Objective-C версия ответа @Peter Peng:
_actionDelayTimer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:[NSBlockOperation blockOperationWithBlock:^{
NSLog(@"Well this is useless.");
}] selector:@selector(main) userInfo:nil repeats:YES];
Ответ 5
Это довольно легко, но он не включен в структуру Apple, пока не по крайней мере.
Вы можете написать оболочку на основе блока для NSTimer
самостоятельно, например. используя GCD, или вы можете использовать существующие сторонние библиотеки, такие как этот: https://github.com/jivadevoe/NSTimer-Blocks.
Ответ 6
Я создал категорию в NSTimer, которая позволяет использовать ее с блоками.
https://github.com/mBrissman/NSTimer-Block
Ответ 7
Мне нравится этот хак @Питер-Пан!
BlockOperation создается "на лету", владея таймером, который сам является владельцем текущей очереди, и вызывает главный селектор на блоке, чтобы запустить его. Nice.
Обновлено для Swift 3
Timer.scheduledTimer(timeInterval: 1, target: BlockOperation {
// ...
}, selector: #selector(Operation.main), userInfo: nil, repeats: false)
Ответ 8
По состоянию на конец 2018 года вы делаете это именно так:
Timer.scheduledTimer(withTimeInterval: 0.25, repeats: true) { timer in
print("no, seriously, this works on iPhone")
}
Это благодаря @JohnnyC!
Действительно странно!
![enter image description here]()