मैं स्विफ्ट में टाइमर (पूर्व NSTimer) का उपयोग कैसे कर सकता हूं?


257

मैंने कोशिश की

var timer = NSTimer()
timer(timeInterval: 0.01, target: self, selector: update, userInfo: nil, repeats: false)

लेकिन, मुझे एक त्रुटि मिली

'(timeInterval: $T1, target: ViewController, selector: () -> (), userInfo: NilType, repeats: Bool) -> $T6' is not identical to 'NSTimer'

1
"मैं स्विफ्ट में एनटीएसएमर का उपयोग कैसे कर सकता हूं?" - जिस तरह से आप Objective-C में इसका इस्तेमाल करते हैं। इसका एपीआई नहीं बदला।
पैरामैग्नेटिक क्रोइसैंट

जवाबों:


534

यह काम करेगा:

override func viewDidLoad() {
    super.viewDidLoad()
    // Swift block syntax (iOS 10+)
    let timer = Timer(timeInterval: 0.4, repeats: true) { _ in print("Done!") }
    // Swift >=3 selector syntax
    let timer = Timer.scheduledTimer(timeInterval: 0.4, target: self, selector: #selector(self.update), userInfo: nil, repeats: true)
    // Swift 2.2 selector syntax
    let timer = NSTimer.scheduledTimerWithTimeInterval(0.4, target: self, selector: #selector(MyClass.update), userInfo: nil, repeats: true)
    // Swift <2.2 selector syntax
    let timer = NSTimer.scheduledTimerWithTimeInterval(0.4, target: self, selector: "update", userInfo: nil, repeats: true)
}

// must be internal or public. 
@objc func update() {
    // Something cool
}

स्विफ्ट 4 के लिए, जिस विधि को आप चयनकर्ता को प्राप्त करना चाहते हैं, वह ऑब्जेक्टिव-सी के संपर्क में होना चाहिए, इस प्रकार @objcविशेषता को विधि घोषणा में जोड़ा जाना चाहिए।


2
मुझे लगता है कि इन तरीकों के साथ वर्ग एक NSObject होना चाहिए, अन्यथा आप एक अज्ञात चयनकर्ता त्रुटि के साथ समाप्त होता है
यहोशू

27
Xcode 6.1 के अनुसार, मुझे "@objc" को फंक्शन हेडर में इस तरह जोड़ना था: "@objc func update () {"। इसके बिना ऐप पहली आग पर क्रैश हो जाता है।
केव

आप वार् टाइमर की घोषणा कर सकते हैं: NSTimer! शुरू में और जब भी जरूरत हो इसका इस्तेमाल करें!
निगालन

1
ब्लॉक सिंटैक्स का संभवतः अधिक उपयोगी संस्करण: टाइमर = Timer.scheduledTimer (withTimeInterval: timeout, repeats: false) {_ in प्रिंट ("संपन्न"))
Teo Sarton

आप 'लेट टाइमर = टाइमर (टाइमइंटरवल: 0.4, रिपीट: ट्रू) {_ इन प्रिंट ("संपन्न!")} का उपयोग नहीं कर सकते हैं। यह टाइमर शुरू नहीं करेगा और फिर आपको इसे दोहराने के लिए नहीं मिल सकता है। आपको Timer.scheduledTimer का उपयोग करना चाहिए।
सियामास्टर

149

बार-बार होने वाली घटना

आप एक टाइमर का उपयोग कई बार एक क्रिया करने के लिए कर सकते हैं, जैसा कि निम्नलिखित उदाहरण में देखा गया है। टाइमर हर आधे सेकंड में एक लेबल को अपडेट करने के लिए एक विधि कहता है।

यहां छवि विवरण दर्ज करें

यहाँ उस के लिए कोड है:

import UIKit

class ViewController: UIViewController {

    var counter = 0
    var timer = Timer()

    @IBOutlet weak var label: UILabel!

    // start timer
    @IBAction func startTimerButtonTapped(sender: UIButton) {
        timer.invalidate() // just in case this button is tapped multiple times

        // start the timer
        timer = Timer.scheduledTimer(timeInterval: 0.5, target: self, selector: #selector(timerAction), userInfo: nil, repeats: true)
    }

    // stop timer
    @IBAction func cancelTimerButtonTapped(sender: UIButton) {
        timer.invalidate()
    }

    // called every time interval from the timer
    func timerAction() {
        counter += 1
        label.text = "\(counter)"
    }
}

विलंबित घटना

आप भविष्य में कुछ समय के लिए किसी एक समय कार्यक्रम को शेड्यूल करने के लिए टाइमर का भी उपयोग कर सकते हैं। उपरोक्त उदाहरण से मुख्य अंतर यह है कि आप repeats: falseइसके बजाय का उपयोग करते हैं true

timer = Timer.scheduledTimer(timeInterval: 2.0, target: self, selector: #selector(delayedAction), userInfo: nil, repeats: false)

उपरोक्त उदाहरण delayedActionटाइमर सेट होने के दो सेकंड के बाद एक विधि को कॉल करता है। यह दोहराया नहीं जाता है, लेकिन आप अभी भी कॉल कर सकते हैं timer.invalidate()यदि आपको कभी भी ऐसा होने से पहले घटना को रद्द करने की आवश्यकता हो।

टिप्पणियाँ

  • यदि आपके टाइमर उदाहरण को कई बार शुरू करने का कोई मौका है, तो सुनिश्चित करें कि आप पहले पुराने टाइमर उदाहरण को अमान्य करते हैं। अन्यथा आप टाइमर के संदर्भ को खो देते हैं और आप इसे अब और नहीं रोक सकते। ( यह प्रश्नोत्तर देखें )
  • जब जरूरत न हो तो टाइमर का उपयोग न करें। IOS एप्स के लिए एनर्जी एफिसिएंसी गाइड के टाइमर्स सेक्शन को देखें ।

सम्बंधित


1
@ शरददेव, मुझे बताने के लिए धन्यवाद। मैंने पुरानी स्विफ्ट 3 टिप्पणी को हटा दिया।
सुरगाछ

31

उपयोगकर्ता स्विफ्ट 4 का लाभ उठाने के लिए

class TimerSample {

    var timer: Timer?

    func startTimer() {
        timer = Timer.scheduledTimer(timeInterval: 5.0,
                                     target: self,
                                     selector: #selector(eventWith(timer:)),
                                     userInfo: [ "foo" : "bar" ],
                                     repeats: true)
    }

    // Timer expects @objc selector
    @objc func eventWith(timer: Timer!) {
        let info = timer.userInfo as Any
        print(info)
    }

}

2
एक कार्यशील उदाहरण दिखाएं, "कस्टम" और "डेटा" का क्या अर्थ है यदि फ़ंक्शन किसी NSTimerवस्तु की उम्मीद कर रहा है
कार्लोस। वी।

1
यह वास्तव में कोई फर्क नहीं पड़ता। आप उपयोगकर्ताइनो शब्दकोश में जो कुछ भी चाहते हैं उसे स्टोर करने के लिए स्वतंत्र हैं, इस मामले में यह मनमाने ढंग से कुंजी-जोड़ी है।
.ग्रेसचेंग

यह उपयोगी है, लेकिन स्विफ्ट 3 में तोड़ दिया, काम कर रहे उदाहरण: Timer.scheduledTimer (timeInterval: 1.0, लक्ष्य: स्वयं, चयनकर्ता: #selector (घटना), userInfo: "जानकारी भेजा", दोहराता: सच)
बॉबी

28

IOS 10 के रूप में एक नया ब्लॉक आधारित टाइमर फैक्ट्री विधि है जो चयनकर्ता का उपयोग करने की तुलना में क्लीनर है:

    _ = Timer.scheduledTimer(withTimeInterval: 5, repeats: false) { timer in
        label.isHidden = true
    }

1
जिस तरह से आप इसे कर रहे हैं, क्या यह बेहतर नहीं होगा कि आप इसे हटा दें _ = और बस शुरू करें Timer?
हनी

2
यदि आप अप्रयुक्त मान के बारे में चेतावनी देते हैं या यदि आप चेतावनी के बारे में परवाह नहीं करते हैं तो आप _ = को छोड़ सकते हैं। मुझे चेतावनियों के साथ कोड जांचना पसंद नहीं है।
जोश होमन

22

स्विफ्ट 3, पूर्व आईओएस 10

func schedule() {
    DispatchQueue.main.async {
      self.timer = Timer.scheduledTimer(timeInterval: 20, target: self,
                                   selector: #selector(self.timerDidFire(timer:)), userInfo: nil, repeats: false)
    }
  }

  @objc private func timerDidFire(timer: Timer) {
    print(timer)
  }

स्विफ्ट 3, आईओएस 10+

DispatchQueue.main.async {
      self.timer = Timer.scheduledTimer(withTimeInterval: 20, repeats: false) { timer in
        print(timer)
      }
    }

टिप्पणियाँ

  • इसे मुख्य कतार में होना चाहिए
  • कॉलबैक फ़ंक्शन सार्वजनिक, निजी, हो सकता है ...
  • कॉलबैक फ़ंक्शन होना आवश्यक है @objc

1
मेरी समझ यह है कि केवल टाइमर कॉलबैक मुख्य कतार पर होना चाहिए और यह कि निम्नलिखित कुछ अधिक कुशल होगा: self.timer = Timer.scheduledTimer (withTimeInterval: 20, दोहराता है: गलत) {टाइमर में DispatchQueue.main.async {प्रिंट (टाइमर)}}
मैथ्यू फ्रेनेट

मेरा टाइमर मेरे किसी एक ऑब्जेक्ट से ट्रिगर नहीं हो रहा था और इससे ट्रिक बन गई :)
रीमोंड हिल

@ReimondHill आपको बदलने की आवश्यकता हैtimeInterval
onmyway133

17

इससे जाँच करें:

स्विफ्ट 2

var timer = NSTimer.scheduledTimerWithTimeInterval(0.01, target: self, selector: Selector("update"), userInfo: nil, repeats: true)

स्विफ्ट 3, 4, 5

var timer = Timer.scheduledTimer(timeInterval: 0.01, target: self, selector: #selector(self.update), userInfo: nil, repeats: true)

2
मैंने पहले ही यह कोशिश कर ली थी, लेकिन यह कहता है कि '
इनविट

1
यहाँ भी, मुझे त्रुटि मिली 'आपूर्ति के तर्कों को स्वीकार करने वाले' इनिट 'के लिए एक अधिभार नहीं मिला।' क्या यह लाइन वास्तव में काम करती है?
यांगशुन तय

मुझे @angshun जैसी ही त्रुटि मिलती है। किस प्रकार की वस्तु होनी selfचाहिए? UIView ठीक है?
सिंपलीजेन

@SimpleAsCouldBe: हाँ यह ठीक है
मिधुन MP

func amountSubmitSuccess () {self.view.hideToastActivity () self.view.makeToast (संदेश: "राशि सफलतापूर्वक पंजीकृत") var टाइमर = NSTimer.schededTimerWithTimeInterval (0.5, लक्ष्य: स्वयं, चयनकर्ता: "MoveToBadderPagePagePage) दोहराता है: असत्य)} func MoveToBidderPage () {let loginPageView = self.oryoryboard? .instantiateViewControllerWithIdentifier ("bidderpageID") को इस रूप में देखें! BidderPage self.navigationController; .pushViewController (loginPageView, एनिमेटेड: true)}
AG

11

आपको स्विफ्ट 3 में NSTimer के बजाय टाइमर का उपयोग करने की आवश्यकता होगी ।

यहाँ एक उदाहरण है:

Timer.scheduledTimer(timeInterval: 1, 
    target: self, 
    selector: #selector(YourController.update), 
    userInfo: nil, 
    repeats: true)

// @objc selector expected for Timer
@objc func update() {
    // do what should happen when timer triggers an event
}

11

स्विफ्ट 5

मैं व्यक्तिगत रूप से टाइमर को बंद करने के साथ पसंद करता हूं:

    Timer.scheduledTimer(withTimeInterval: 1, repeats: false) { (_) in
       // TODO: - whatever you want
    }

ज्ञात हो, यह केवल macOS 10.12 या नए में उपलब्ध है। Ios के बारे में निश्चित नहीं है।
jeff-h

यह iOS में भी उपलब्ध है।
विस्सा

7

स्विफ्ट 3 और Xcode 8.2 के लिए (ब्लॉक होने के लिए अच्छा है, लेकिन अगर आप iOS9 के लिए संकलन करते हैं और userInfo चाहते हैं):

...

        self.timer = Timer(fireAt: fire,
                           interval: deltaT,
                           target: self,
                           selector: #selector(timerCallBack(timer:)),
                           userInfo: ["custom":"data"],
                           repeats: true)

        RunLoop.main.add(self.timer!, forMode: RunLoopMode.commonModes)
        self.timer!.fire()
}

func timerCallBack(timer: Timer!){
        let info = timer.userInfo
        print(info)
    }

6

SimpleTimer (स्विफ्ट 3.1)

क्यों?

यह स्विफ्ट में एक साधारण टाइमर क्लास है जो आपको सक्षम बनाता है:

  • स्थानीय स्कॉप्ड टाइमर
  • chainable
  • एक लाइनर
  • नियमित कॉलबैक का उपयोग करें

उपयोग:

SimpleTimer(interval: 3,repeats: true){print("tick")}.start()//Ticks every 3 secs

कोड:

class SimpleTimer {/*<--was named Timer, but since swift 3, NSTimer is now Timer*/
    typealias Tick = ()->Void
    var timer:Timer?
    var interval:TimeInterval /*in seconds*/
    var repeats:Bool
    var tick:Tick

    init( interval:TimeInterval, repeats:Bool = false, onTick:@escaping Tick){
        self.interval = interval
        self.repeats = repeats
        self.tick = onTick
    }
    func start(){
        timer = Timer.scheduledTimer(timeInterval: interval, target: self, selector: #selector(update), userInfo: nil, repeats: true)//swift 3 upgrade
    }
    func stop(){
        if(timer != nil){timer!.invalidate()}
    }
    /**
     * This method must be in the public or scope
     */
    @objc func update() {
        tick()
    }
}

फिर कुछ शर्तों पर उस ब्लॉक के अंदर टाइमर को कैसे रोकें?
मोबाइल डेवलपर iOS Android

बस एक कक्षा में टाइमर को रेफरी स्टोर करें फिर बस स्टॉप पर कॉल करें।
एक्सकोड

3
timer = Timer.scheduledTimer(timeInterval: 1, target: self, selector: #selector(createEnemy), userInfo: nil, repeats: true)

और नाम से मज़ा बनाएँ

fund createEnemy ()
{
do anything ////
}

3

पहले अपना टाइमर घोषित करें

var timer: Timer?

फिर viewDidLoad () या किसी भी फ़ंक्शन में आप टाइमर शुरू करना चाहते हैं, में लाइन जोड़ें

timer = Timer.scheduledTimer(timeInterval: 1, target: self, selector: #selector(action), userInfo: nil, repeats: false)

यह वह फेक है जिसे आप कॉल करने के लिए इसे कुछ करने के लिए @objc होना चाहिए

@objc func action () {
print("done")
}

2

में स्विफ्ट 3 @objc के साथ कुछ इस तरह:

func startTimerForResendingCode() {
    let timerIntervalForResendingCode = TimeInterval(60)
    Timer.scheduledTimer(timeInterval: timerIntervalForResendingCode,
                         target: self,
                         selector: #selector(timerEndedUp),
                         userInfo: nil,
                         repeats: false)
}




@objc func timerEndedUp() {
    output?.timerHasFinishedAndCodeMayBeResended()
}

1

यदि आप टाइमर की init विधि

let timer = Timer(timeInterval: 3, target: self, selector: #selector(update(_:)), userInfo: [key : value], repeats: false)

func update(_ timer : Timer) {

}

फिर इसे लूप में जोड़ें विधि का उपयोग करके अन्य चयनकर्ता को नहीं बुलाया जाएगा

RunLoop.main.add(timer!, forMode: .defaultRunLoopMode)

नोट: यदि आप चाहते हैं कि यह दोहराए जाने वाले दोहराव को सही रखें और टाइमर का संदर्भ रखें अन्यथा अपडेट विधि नहीं कहा जाएगा।

यदि आप इस विधि का उपयोग कर रहे हैं।

Timer.scheduledTimer(timeInterval: seconds, target: self, selector: #selector(update(_:)), userInfo: nil, repeats: true)

यदि दोहराव सत्य है, तो बाद में उपयोग के लिए एक संदर्भ रखें।


0

मैंने एक NSObject क्लास में करने की कोशिश की और इसने मेरे लिए काम किया:

DispatchQueue.main.asyncAfter(deadline: .now() + .milliseconds(300)) {  
print("Bang!") }

-2

स्विफ्ट 4.2 में NSTimer का नाम बदलकर टाइमर कर दिया गया है। यह सिंटैक्स 4.2 में काम करेगा:

let timer = Timer.scheduledTimer(timeInterval: 1.0, target: self, selector: #selector(UIMenuController.update), userInfo: nil, repeats: true)

नाम बदलकर स्विफ्ट 3 में हुआ और अन्य उत्तर पहले ही अपडेट कर चुके हैं ...
एरिक आया
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.