Timer.scheduledTimer Swift 3 до совместимости с iOS 10
Мне нужно запланировать таймер для срабатывания функции каждую секунду, но я вижу, что в xcode 8 beta 3 запланированный таймер доступен только для iOS 10. Есть ли альтернатива использованию таймера в iOS 9 или предыдущих версиях?
Timer.scheduledTimer(withTimeInterval: 1, repeats: true, block: { (timer) in print("Hi!")})
7 ответов
Решено с помощью
Timer.scheduledTimer(timeInterval: 1,
target: self,
selector: #selector(self.updateTime),
userInfo: nil,
repeats: true)
Запустите таймер с 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()
}
Отпустите таймер, когда вы его не используете.
После того, как запланировано на цикл выполнения, таймер срабатывает с указанным интервалом, пока он не станет недействительным. Неповторяющийся таймер аннулирует себя сразу после его срабатывания. Однако для повторяющегося таймера вы должны самостоятельно аннулировать объект таймера, вызвав его метод invalidate().
Вот пример кода, работающего с совместимостью:
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
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)")
}
}
Обновлено для Swift 3:
Если вы хотите использовать Таймер для некоторой задержки или для любой другой цели, используйте приведенные ниже строки кода в вашем проекте;
// определение функции:
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()
ПРИМЕЧАНИЕ:- вы можете изменить временной интервал, как вы хотите.
// Наслаждайтесь кодированием..!
Вы можете использовать следующую простую прокладку, чтобы предоставить новые блочные таймеры до 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!")
}
Правильная форма:
Timer.scheduledTimer(withTimeInterval: 2, repeats: false){_ in
"Here your code method"
}