Timer.scheduledTimer Swift 3 pre-iOS 10 compatibility

后端 未结 8 2025
我寻月下人不归
我寻月下人不归 2020-12-15 16:31

I need to schedule a Timer for firing a function every second but I see that in Xcode 8 beta 3 the scheduledTimer is only available for iOS 10.

Is there any alternat

相关标签:
8条回答
  • 2020-12-15 16:49

    You can use the following simple shim to provide the new block-based Timers to pre-iOS 10:

    class TimerShim {
        private var timer: Timer?
        private let block: (Timer) -> Void
    
        private init(timeInterval interval: TimeInterval, repeats: Bool, block: @escaping (Timer) -> Void) {
            self.block = block
            timer = Timer.scheduledTimer(timeInterval: interval, target: self, selector: #selector(timerDidFire), userInfo: nil, repeats: repeats)
        }
    
        class func scheduledTimer(withTimeInterval interval: TimeInterval, repeats: Bool, block: @escaping (Timer) -> Void) -> Timer {
            return TimerShim(timeInterval: interval, repeats: repeats, block: block).timer!
        }
    
        @objc private func timerDidFire() {
            block(timer!)
        }
    }
    

    Usage example:

    TimerShim.scheduledTimer(withTimeInterval: 5, repeats: false) { _ in
        print("boom!")
    }
    
    0 讨论(0)
  • 2020-12-15 16:52

    Swift 3

    func runCode(in timeInterval:TimeInterval, _ code:@escaping ()->(Void))
    {
        DispatchQueue.main.asyncAfter(
            deadline: .now() + timeInterval,
            execute: code)
    }
    
    func runCode(at date:Date, _ code:@escaping ()->(Void))
    {
        let timeInterval = date.timeIntervalSinceNow
        runCode(in: timeInterval, code)
    }
    
    func test()
    {
        runCode(at: Date(timeIntervalSinceNow:2))
        {
            print("Hello")
        }
    
        runCode(in: 3.0)
        {
            print("World)")
        }
    }
    
    0 讨论(0)
  • 2020-12-15 16:57

    Updated for swift 3:

    If you want to use Timer for some delay or any other purpose used below lines of code in your project;

    // function defination:

    func usedTimerForDelay()  {
        Timer.scheduledTimer(timeInterval: 0.3,
                             target: self,
                             selector: #selector(self.run(_:)),
                             userInfo: nil, 
                             repeats: false)
    }
    
    func run(_ timer: AnyObject) {
          print("Do your remaining stuff here...")
    
    }
    

    // function call:

    self.usedTimerForDelay()
    

    NOTE:- you can change the time interval as you want.

    //Enjoy coding..!

    0 讨论(0)
  • 2020-12-15 17:00

    Solved using

    Timer.scheduledTimer(timeInterval: 1,
                               target: self,
                             selector: #selector(self.updateTime),
                             userInfo: nil,
                              repeats: true)
    
    0 讨论(0)
  • 2020-12-15 17:01

    Run a timer with swift3,

    var timer: Timer?
    
    func startTimer() {
    
        if timer == nil {
            timer = Timer.scheduledTimer(timeInterval: 3, target: self, selector: #selector(self.loop), userInfo: nil, repeats: true)
        }
    }
    
    func stopTimer() {
        if timer != nil {
            timer?.invalidate()
            timer = nil
        }
    }
    
    func loop() {
        let liveInfoUrl = URL(string: "http://192.168.1.66/api/cloud/app/liveInfo/7777")
        let task = URLSession.shared.dataTask(with: liveInfoUrl! as URL) {data, response, error in
            guard let data = data, error == nil else { return }
            print(String(data: data, encoding: String.Encoding(rawValue: String.Encoding.utf8.rawValue)) ?? "aaaa")
        }
        task.resume()
    }
    

    Release the timer when you not use it.

    Once scheduled on a run loop, the timer fires at the specified interval until it is invalidated. A nonrepeating timer invalidates itself immediately after it fires. However, for a repeating timer, you must invalidate the timer object yourself by calling its invalidate() method.

    0 讨论(0)
  • 2020-12-15 17:01
    Timer.scheduledTimer
    

    Put it in the main thread.

    0 讨论(0)
提交回复
热议问题