Câu trả lời:
var helloWorldTimer = NSTimer.scheduledTimerWithTimeInterval(60.0, target: self, selector: Selector("sayHello"), userInfo: nil, repeats: true)
func sayHello()
{
NSLog("hello World")
}
Nhớ nhập Foundation.
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")
}
NSTimer
giữ lại mục tiêu của nó, vì vậy, với thiết lập này, nếu helloWorldTimer
là một thuộc tính trên, self
bạn đã có cho mình một chu kỳ lưu giữ, nơi self
giữ lại helloWorldTimer
và helloWorldTimer
giữ lại self
.
Nếu nhắm mục tiêu phiên bản iOS 10 trở lên, bạn có thể sử dụng kết xuất dựa trên khối Timer
, giúp đơn giản hóa các chu kỳ tham chiếu mạnh tiềm năng, ví dụ:
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()
}
Mặc dù Timer
nói chung là tốt nhất, vì lợi ích của sự hoàn chỉnh, tôi nên lưu ý rằng bạn cũng có thể sử dụng bộ đếm thời gian gửi, rất hữu ích để lập lịch bộ hẹn giờ trên các luồng nền. Với bộ hẹn giờ gửi, vì chúng dựa trên khối, nên nó tránh được một số thách thức về chu trình tham chiếu mạnh mẽ với mẫu target
/ cũ , miễn là bạn sử dụng tham chiếu.selector
Timer
weak
Vì thế:
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!.schedule(deadline: .now(), repeating: .seconds(60))
timer!.setEventHandler { [weak self] in
// do whatever you want here
}
timer!.resume()
}
func stopTimer() {
timer?.cancel()
timer = nil
}
deinit {
self.stopTimer()
}
Để biết thêm thông tin, hãy xem phần Tạo hẹn giờ của Ví dụ về Nguồn Công văn trong phần Nguồn Công văn của Hướng dẫn Lập trình Đồng thời.
Đối với Swift 2, hãy xem bản sửa đổi trước của câu trả lời này .
dispatch_after
. Hoặc một không lặp lại NSTimer
.
Đây là bản cập nhật cho NSTimer
câu trả lời, dành cho Swift 3 ( NSTimer
đã được đổi tên thành Timer
) bằng cách sử dụng một hàm đóng thay vì một hàm được đặt tên:
var timer = Timer.scheduledTimer(withTimeInterval: 60, repeats: true) {
(_) in
print("Hello world")
}
Nếu bạn có thể cho phép một thời gian trôi qua, đây là một giải pháp đơn giản thực hiện một số mã mỗi phút:
private func executeRepeatedly() {
// put your code here
DispatchQueue.main.asyncAfter(deadline: .now() + 60.0) { [weak self] in
self?.executeRepeatedly()
}
}
Chỉ cần chạy executeRepeatedly()
một lần và nó sẽ được thực thi mỗi phút. Việc thực thi dừng lại khi đối tượng sở hữu ( self
) được giải phóng. Bạn cũng có thể sử dụng một cờ để chỉ ra rằng việc thực thi phải dừng lại.
Bạn có thể sử dụng Timer
(nhanh chóng 3)
var timer = Timer.scheduledTimerWithTimeInterval(60, target: self, selector: Selector("function"), userInfo: nil, repeats: true)
Trong selector (), bạn nhập tên hàm của mình
Timer
... NSTimer
đã được đổi tên
Trong 3.0 nhanh chóng, GCD đã được cấu trúc lại:
let timer : DispatchSourceTimer = DispatchSource.makeTimerSource(flags: [], queue: DispatchQueue.main)
timer.scheduleRepeating(deadline: .now(), interval: .seconds(60))
timer.setEventHandler
{
NSLog("Hello World")
}
timer.resume()
Điều này đặc biệt hữu ích khi bạn cần gửi trên một Hàng đợi cụ thể. Ngoài ra, nếu bạn định sử dụng tính năng này để cập nhật giao diện người dùng, tôi khuyên bạn nên xem xét CADisplayLink
vì nó được đồng bộ hóa với tốc độ làm mới GPU.