Подтвердить что ты не робот

NSTimer с анонимной функцией/блоком?

Я хочу иметь возможность планировать три небольших события в будущем без необходимости писать функцию для каждого. Как это сделать, используя NSTimer? Я понимаю, что блоки облегчают анонимные функции, но могут ли они использоваться в NSTimer, и если да, то как?

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

Ответ 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.

Ответ 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