Быстрые задержки таймера - PullRequest
0 голосов
/ 18 июня 2020

Я знаю, что Timer не гарантированно будет работать с той скоростью, которую вы просили. Тем не менее, я только что начал новый проект с этим:

class ViewController: NSViewController {

    var timer = Timer()
    var count: Double = 0.0
    var timeStamp: Date = Date()

override func viewDidLoad() {
    super.viewDidLoad()
    self.timer = Timer.scheduledTimer(timeInterval: 0.1,
                                      target: self,
                                      selector: #selector(self.updateCounting),
                                      userInfo: nil,
                                      repeats: true)
}

@objc func updateCounting(){
    let duration = self.timeStamp.distance(to: Date())
    print("Counting \(self.count) vs. Real life \(duration)")
    self.count = self.count + 0.1
}

}

Я ожидаю получить примерно такие же результаты между count и duration, но я вижу странные например:

Counting 60.50000000000059 vs. Real life 60.64057409763336
Counting 60.60000000000059 vs. Real life 60.741435050964355
Counting 60.70000000000059 vs. Real life 70.84065008163452
Counting 60.800000000000594 vs. Real life 80.94094407558441
Counting 60.900000000000595 vs. Real life 82.99448704719543

Протестировано на Xcode 11.5, на iMa c и MacBook Pro. Я что-то здесь не так делаю?

1 Ответ

0 голосов
/ 18 июня 2020

Правильно, но вы пропустили Руководство по энергоэффективности для Ma c Приложения :

Ваше приложение просто дремало.

Проверьте ProcessInfo и найдите Управление действиями . Пример (плохой) - изменить AppDelegate.swift на:

@NSApplicationMain
class AppDelegate: NSObject, NSApplicationDelegate {
    private var activity: NSObjectProtocol!

    func applicationDidFinishLaunching(_ aNotification: Notification) {
        let options: ProcessInfo.ActivityOptions = [.userInitiatedAllowingIdleSystemSleep]
        let reason = "No napping!"
        self.activity = ProcessInfo.processInfo.beginActivity(options: options, reason: reason)
    }

    func applicationWillTerminate(_ aNotification: Notification) {
        ProcessInfo.processInfo.endActivity(activity)
    }
}

Но не делайте этого, это плохо для пользователей, время автономной работы MacBook Pro и т. Д. c.

...