जवाबों:
var helloWorldTimer = NSTimer.scheduledTimerWithTimeInterval(60.0, target: self, selector: Selector("sayHello"), userInfo: nil, repeats: true)
func sayHello()
{
NSLog("hello World")
}
फाउंडेशन आयात करना याद रखें।
स्विफ्ट 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
यह लक्ष्य बनाए रखता है, इसलिए, इस सेटअप के साथ, यदि आपके पास helloWorldTimer
एक संपत्ति है , तो self
आप अपने आप को एक चक्र बनाए रखें, जहां self
बनाए रखता है helloWorldTimer
और helloWorldTimer
रखता है self
।
यदि iOS संस्करण 10 और उससे अधिक को लक्षित किया जाता है, तो आप ब्लॉक-आधारित रेंडरिंग का उपयोग कर सकते हैं Timer
, जो संभावित मजबूत संदर्भ चक्रों को सरल करता है, जैसे:
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()
}
जबकि Timer
आम तौर पर सर्वोत्तम है, पूर्णता के लिए, मुझे ध्यान देना चाहिए कि आप डिस्पैच टाइमर का भी उपयोग कर सकते हैं, जो पृष्ठभूमि थ्रेड्स पर टाइमर शेड्यूल करने के लिए उपयोगी है। प्रेषण टाइमर के साथ, चूंकि वे ब्लॉक-आधारित हैं, इसलिए जब तक आप संदर्भ का उपयोग करते हैं, तब तक पुराने target
/ selector
पैटर्न के साथ कुछ मजबूत संदर्भ चक्र चुनौतियों से बचते हैं ।Timer
weak
इसलिए:
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()
}
अधिक जानकारी के लिए, कंसीडर प्रोग्रामिंग गाइड के डिस्पैच सोर्सेज सेक्शन में डिस्पैच सोर्स एग्जाम्पल्स का टाइमर सेक्शन बनाना देखें ।
स्विफ्ट 2 के लिए, इस उत्तर का पिछला संशोधन देखें ।
dispatch_after
। या एक गैर-दोहराव NSTimer
।
यहां NSTimer
उत्तर के लिए एक अद्यतन है , स्विफ्ट 3 के लिए (जिसमें NSTimer
नाम बदला गया था Timer
) एक नामित फ़ंक्शन के बजाय एक क्लोजर का उपयोग करते हुए:
var timer = Timer.scheduledTimer(withTimeInterval: 60, repeats: true) {
(_) in
print("Hello world")
}
यदि आप कुछ समय के लिए बहाव कर सकते हैं, तो हर मिनट किसी न किसी कोड को निष्पादित करने का एक सरल उपाय है:
private func executeRepeatedly() {
// put your code here
DispatchQueue.main.asyncAfter(deadline: .now() + 60.0) { [weak self] in
self?.executeRepeatedly()
}
}
बस executeRepeatedly()
एक बार चलाएं और इसे हर मिनट निष्पादित किया जाएगा। निष्पादन ऑब्जेक्ट बंद होने पर निष्पादन बंद हो जाता self
है। आप एक झंडे का उपयोग यह इंगित करने के लिए भी कर सकते हैं कि निष्पादन बंद होना चाहिए।
आप उपयोग कर सकते हैं Timer
(स्विफ्ट 3)
var timer = Timer.scheduledTimerWithTimeInterval(60, target: self, selector: Selector("function"), userInfo: nil, repeats: true)
चयनकर्ता () में आप अपने फ़ंक्शन का नाम डालते हैं
Timer
... NSTimer
का नाम बदल दिया गया है
स्विफ्ट 3.0 में जीसीडी रिफ्लेक्ट हो गया:
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 रीफ्रेश दर के साथ सिंक्रनाइज़ है।