2016-08-01 28 views
22

Muszę zaprogramować zegar do wypalania funkcji co sekundę, ale widzę, że w xcode 8 beta 3 program planowany jest dostępny tylko dla iOS 10. Czy jest jakaś alternatywa dla korzystania z timera w systemie iOS 9 lub w poprzednich wersjach?Timer.scheduledTimer swift 3 zgodność z iOS 10

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

Odpowiedz

44

rozwiązać za pomocą

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

Jeśli chcesz, możesz użyć 'jeśli #available (iOS 10, *) {//iOS 10 code} else {// iOS 9 code} 'do obsługi obu w zależności od wersji systemu operacyjnego. – Awesomeness

+0

Musiałem dodać napisać funkcję docelową w następujący sposób: '@objc func updateTime() {}' – Jonny

+0

Warto również przyjrzeć się niższym postom, aby zobaczyć, jak przestają działać stoper. Może nie zostać usunięty z pętli uruchamiania, jeśli nie zostanie usunięty ręcznie. – kbpontius

-4

Prawidłowa forma jest:

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

To nie działa na iOS 9, ale pytanie o kompatybilność hhamm

+1

Dobra, kod działa na szybkie 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)") 
    } 
} 
9

Uruchomić stoper z 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() 
} 

Zwolnij timer, gdy go nie używasz.

Po zaplanowano na pętli biegu, pożary czasomierza w określonym przedziale dopóki nie zostanie unieważniony. Niepowtarzalny zegar unieważnia natychmiast po uruchomieniu. Jednak w przypadku powtarzającego się zegara użytkownik musi samodzielnie unieważnić obiekt czasomierza, wywołując metodę invalidate() .

+1

Świetna robota wskazująca na koniec '.invalidate()' timera, a także pętlę uruchamiania. – kbpontius

+0

Kontrola zerowa dla timera jest niepotrzebna. Jest już opcjonalne. –

2

Aktualizacja dla szybkiej 3:

Jeśli chcesz korzystać z zegara na pewnym opóźnieniem lub w jakimkolwiek innym celu używane poniżej linii kodu w projekcie; Funkcja

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

} 

// wywołanie funkcji:

self.usedTimerForDelay() 

UWAGA: - można zmienić odstęp czasu, ile chcesz.

// Ciesz się kodowaniem ...!

0

Oto przykładowy kod wykonalne z Kompatybilność:

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

// metodę lub funkcję:

// MARK: - Method 

@objc func myMethod() { 

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