2017-12-06 2 views
0

Lassen Sie uns sagen, ich habe eine View-Controller mit Code, den ich zu einer bestimmten Zeit ausführen möchte, sagen 14.00 Uhr. Was ich will, ist, dass, wenn der Benutzer den View-Controller um 1:58 Uhr öffnet, der Code warten und kontinuierlich die Zeit überprüfen wird, die sich genau um 14:00 Uhr ausführt. Gibt es eine Möglichkeit, dies in Swift 4 zu tun, vielleicht mit einem Timer?Mit einem Code-Block warten auf eine bestimmte Zeit in iOS

Antwort

1

Sie können rund um diese Weise gehen, um das Ergebnis zu erzielen:

override func viewDidLoad() { 
    super.viewDidLoad() 
    let dateFormatter = DateFormatter() 
    /*The accepted DateFormat*/ 
    dateFormatter.dateFormat = "MM-dd-yyyy HH:mm" 
    /*My Date String to run the code at*/ 
    let dateString = "12-06-2017 15:41" 
     let date = dateFormatter.date(from: dateString) 

     /*Now find the time differnce from now*/ 
     let secondsFromNowToFinish = date?.timeIntervalSinceNow 

     DispatchQueue.main.asyncAfter(deadline: .now() + secondsFromNowToFinish!, execute: { 

      print ("Hello Future.") 
     }) 


    } 

Getestet und läuft. enter image description here

Referenzen:

DateFormatter

Convert Date String to Date

Glücklich Codierung. Ich hoffe es hilft. Bitte entfernen Sie die Zwangsauswicklungen.

-1

über DispatchQueue

Beispiel lesen:

// Delay 2 seconds 
DispatchQueue.main.asyncAfter(deadline: .now() + 2.0) { 
    // your code 
} 

Hinweis: Ihre Anwendung muss aktiv sein. Auch Sie können einen Blick auf Background modes tutorial

+0

Diese Antwort ist nicht hilfreich, da sie nicht die Ausführung der App zu einem bestimmten Zeitpunkt, etwa 14 Uhr, betrifft. Die Dispatch-Warteschlange fügt einfach eine Verzögerung hinzu. Der Start zur gewünschten Zeit erfordert zusätzliche Funktionen, die @ Nicolas Buquet bereitgestellt hat, um die Differenz zwischen der aktuellen Uhrzeit und der gewünschten Startzeit zu berechnen. – ch1maera

1

Sie können die Anzahl der Sekunden zwischen dem zukünftigen Zeitpunkt herauszufinden und jetzt und entweder GCD oder Timer für die Einrichtung Ihres zukünftiges Ereignis verwenden:

let futureDate = ISO8601DateFormatter().date(from: "2018-1-1T00:00:00Z")! 
DispatchQueue.main.asyncAfter(deadline: .now() + futureDate.timeIntervalSinceNow) { 
    print("Its the future!") 
} 

oder

let futureDate = ISO8601DateFormatter().date(from: "2018-1-1T00:00:00Z")! 
let timer = Timer.scheduledTimer(withTimeInterval: futureDate.timeIntervalSinceNow, repeats: false) { 
    print("Its the future!") 
} 

Timer ist einfacher, zu löschen und neu planen:

timer.invalidate() 
1

Sie einen Timer mit einem Feuer Datum zum Runloop hinzufügen:

{ 
    let dateOfExecution = Date(timeIntervalSince1970: <number of seconds from 1970-01-01-00:00:00 to your date of execution>) 
    let timer = Timer(fireAt: dateOfExecution, interval: 0, target: self, selector: #selector(codeToExecute), userInfo: nil, repeats: false) 
    RunLoop.main.add(timer, forMode: RunLoopMode.commonModes) 
} 

@objc func codeToExecute() { 
    <Your code to run> 
} 

Siehe Apple-docs: https://developer.apple.com/documentation/foundation/timer/1415700-init

Verwandte Themen