Timer.scheduledTimer swift 3兼容iOS 10

时间:2016-08-01 09:50:37

标签: ios swift ios9 ios10 xcode8-beta3

我需要安排一个Timer来每秒触发一个函数,但是我发现在xcode 8 beta 3中,scheduledTimer仅适用于iOS 10.在iOS 9或以前版本中使用计时器是否有其他选择?

Timer.scheduledTimer(withTimeInterval: 1, repeats: true, block: { (timer) in print("Hi!")})

8 个答案:

答案 0 :(得分:53)

使用

解决
Timer.scheduledTimer(timeInterval: 1,
                           target: self,
                         selector: #selector(self.updateTime),
                         userInfo: nil,
                          repeats: true)

答案 1 :(得分:15)

使用swift3运行计时器,

x64

不使用时释放计时器。

  

在运行循环上安排后,计时器将在指定的位置触发   间隔,直到它失效。非重复计时器无效   火灾后立即发生。但是,对于重复计时器,你   必须通过调用invalidate()来自己使计时器对象无效   方法

答案 2 :(得分:5)

以下是可兼容的示例代码:

 if #available(iOS 10.0, *) {

        Timer.scheduledTimer(withTimeInterval: 15.0, repeats: true){_ in

            // Your code is here:
            self.myMethod()
        }
    }
    else {

        Timer.scheduledTimer(timeInterval: 15.0, target: self, selector: #selector(self.myMethod), userInfo: nil, repeats: true)
    }

//您的方法或功能:

// MARK: -  Method

@objc func myMethod() {

    print("Hi, How are you.")
}

答案 3 :(得分:3)

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)")
    }
}

答案 4 :(得分:3)

  

更新了swift 3:

如果您想将Timer用于某些延迟或项目代码行中使用的任何其他目的;

//功能定义:

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...")

}

//函数调用:

self.usedTimerForDelay()

注意: - 您可以根据需要更改时间间隔。

//享受编码..!

答案 5 :(得分:1)

import AccessAlarmIcon from '@material-ui/icons/AccessAlarm';

把它放在主线程中。

答案 6 :(得分:1)

您可以使用以下简单的填充程序为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!)
    }
}

用法示例:

TimerShim.scheduledTimer(withTimeInterval: 5, repeats: false) { _ in
    print("boom!")
}

答案 7 :(得分:-5)

正确的形式是:

Timer.scheduledTimer(withTimeInterval: 2, repeats: false){_ in
   "Here your code method"
}