6 ответов:
var helloWorldTimer = NSTimer.scheduledTimerWithTimeInterval(60.0, target: self, selector: Selector("sayHello"), userInfo: nil, repeats: true) func sayHello() { NSLog("hello World") }Не забудьте импортировать Фонда.
Swift 4:
var helloWorldTimer = Timer.scheduledTimer(timeInterval: 60.0, target: self, selector: #selector(ViewController.sayHello), userInfo: nil, repeats: true) @objc func sayHello() { NSLog("hello World") }
в Swift 3, Вы можете создать
Timer. И если вы нацелены на iOS версии 10 и выше, вы можете использовать блок-версию, которая упрощает потенциальные сильные опорные циклы, например:weak var timer: Timer? func startTimer() { timer?.invalidate() // just in case you had existing `Timer`, `invalidate` it before we lose our reference to it timer = Timer.scheduledTimer(withTimeInterval: 60.0, repeats: true) { [weak self] _ in // do something here } } func stopTimer() { timer?.invalidate() } // if appropriate, make sure to stop your timer in `deinit` deinit { stopTimer() }в Swift 2, вы создаете
NSTimer. И если вы используете Swift 2, вы вполне можете использовать версию iOS до 10.0, и в этом случае вам нужно использовать более старуюtarget/selectorшаблон:weak var timer: NSTimer? func startTimer() { timer?.invalidate() // just in case you had existing `NSTimer`, `invalidate` it before we lose our reference to it timer = NSTimer.scheduledTimerWithTimeInterval(60.0, target: self, selector: #selector(handleTimer(_:)), userInfo: nil, repeats: true) } func handleTimer(timer: NSTimer) { // do something here } func stopTimer() { timer?.invalidate() } // because this old target/selector approach will keep a strong reference // to the `target`, if you want the timer to stop when the view controller // is dismissed, you can't stop the timer in `deinit`, but rather have to // detect the dismissing of the view controller using other mechanisms. Commonly, // we used to detect the view disappearing, like below: override func viewDidDisappear(animated: Bool) { super.viewDidDisappear(animated) stopTimer() }
пока
NSTimerкак правило, лучше всего, ради полнота, я должен отметить, что вы также можете использовать таймер отправки, который полезен для планирования таймеров на фоновых потоках. С помощью диспетчерских таймеров, поскольку они основаны на блоках, он позволяет избежать некоторых сильных проблем с циклом ссылок со старымtarget/selectorмодельNSTimer, пока вы используетеweakссылки.Итак, в Swift 3:
var timer: DispatchSourceTimer? func startTimer() { let queue = DispatchQueue(label: "com.domain.app.timer") // you can also use `DispatchQueue.main`, if you want timer = DispatchSource.makeTimerSource(queue: queue) timer!.scheduleRepeating(deadline: .now(), interval: .seconds(60)) timer!.setEventHandler { [weak self] in // do whatever you want here } timer!.resume() } func stopTimer() { timer?.cancel() timer = nil } deinit { self.stopTimer() }В Swift 2:
var timer: dispatch_source_t? func startTimer() { let queue = dispatch_queue_create("com.domain.app.timer", nil) // again, you can use `dispatch_get_main_queue()` if you want to use the main queue timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, queue) dispatch_source_set_timer(timer!, DISPATCH_TIME_NOW, 60 * NSEC_PER_SEC, 1 * NSEC_PER_SEC) // every 60 seconds, with leeway of 1 second dispatch_source_set_event_handler(timer!) { [weak self] in // do whatever you want here } dispatch_resume(timer!) } func stopTimer() { if let timer = timer { dispatch_source_cancel(timer) self.timer = nil } } deinit { self.stopTimer() }для получения дополнительной информации см. the создание таймера раздел Отправка Исходных Примеров на Источники Отправка на Руководство По Программированию Параллелизма.
вот обновление
NSTimerответ, для Swift 3 (в которомNSTimerбыла переименована вTimer) используя замыкание, а не именованную функцию:var timer = Timer.scheduledTimer(withTimeInterval: 60, repeats: true) { (_) in print("Hello world") }
можно использовать
NSTimervar timer = NSTimer.scheduledTimerWithTimeInterval(60, target: self, selector: Selector("function"), userInfo: nil, repeats: true)в selector () вы вводите имя своей функции
в swift 3.0 GCD получил рефакторинг:
let timer : DispatchSourceTimer = DispatchSource.makeTimerSource(flags: [], queue: DispatchQueue.main) timer.scheduleRepeating(deadline: .now(), interval: .seconds(60)) timer.setEventHandler { NSLog("Hello World") } timer.resume()это особенно полезно, когда вам нужно отправить на определенной очереди. Также, если вы планируете использовать это для обновления пользовательского интерфейса, то
CADisplayLinkкак это синхронизировано с частотой обновления GPU.
Если вы можете разрешить в течение некоторого времени дрейф вот простое решение, выполняющее какой-то код каждую минуту:
private func executeRepeatedly() { // put your code here DispatchQueue.main.asyncAfter(deadline: .now() + 60.0) { [weak self] in self?.executeRepeatedly() } }просто запустить
executeRepeatedly()один раз, и он будет выполняться каждую минуту. Выполнение останавливается, когда объект-владелец (self) освобождается. Вы также можете использовать флаг, чтобы указать, что выполнение должно быть остановлено.
Comments