আমি কীভাবে সুইফ্টে টাইমার (পূর্বে এনএসটিমিকার) ব্যবহার করতে পারি?


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
"আমি কীভাবে সুইফটে এনএসটিমার ব্যবহার করতে পারি?" - আপনি এটি একইভাবে উদ্দেশ্য-সিতে ব্যবহার করুন in এর এপিআই পরিবর্তন হয়নি।
প্যারাম্যাগনেটিক ক্রোস্যান্ট

উত্তর:


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
}

সুইফট ৪-এর জন্য, আপনি যে পদ্ধতিতে নির্বাচককে পেতে চান তা অবশ্যই অবজেক্ট-সি-এর কাছে প্রকাশ করা @objcউচিত , সুতরাং পদ্ধতি ঘোষণার সাথে অবশ্যই বৈশিষ্ট্য যুক্ত করতে হবে।


2
আমি যুক্ত করতাম যে এই পদ্ধতিগুলির সাথে ক্লাসটি একটি এনএসবজেক্ট হওয়া দরকার, অন্যথায় আপনি একটি অজ্ঞাত নির্বাচক ত্রুটিটি শেষ করেছেন
জোশুয়া

27
এক্সকোড .1.১ হিসাবে, আমাকে ফাংশন শিরোনামে "@objc" যুক্ত করতে হয়েছিল: "@jjc func আপডেট ()।"। এটি ছাড়াই অ্যাপটি প্রথম আগুনের উপরে ক্র্যাশ হয়ে যায়।
কেভ

আপনি ভার টাইমার ঘোষণা করতে পারেন: এনএসটাইমার! শুরুতে এবং যখনই প্রয়োজন এটি ব্যবহার করুন!
নিগিলান

1
ব্লক সিনট্যাক্সের সম্ভবত আরও কার্যকর সংস্করণ: টাইমার = টাইমরস্কুলিউডটাইমারের সাথে (টাইমআইন্টারওয়াল: সময়সীমা, পুনরাবৃত্তি: মিথ্যা) print _ প্রিন্টে ("সম্পন্ন"))}
তেও সার্তোরি

আপনি 'লেট টাইমার = টাইমার (টাইম অন্তর্বর্তী: 0.4, পুনরাবৃত্তি: সত্য) print _ প্রিন্টে ("সম্পন্ন!") Can't' ব্যবহার করতে পারবেন না not 'এটি টাইমারটি আরম্ভ করবে না এবং তারপরে আপনি এটি পুনরাবৃত্তি করতে পারবেন না। আপনার অবশ্যই টাইমআরসুলেডড টাইমার ব্যবহার করতে হবে।
সিয়ামাস্টার

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()ইভেন্টটি হওয়ার আগে যদি আপনার প্রয়োজন হয় তবে আপনি কল করতে পারেন ।

মন্তব্য

  • যদি আপনার টাইমার উদাহরণটি একাধিকবার শুরু করার কোনও সম্ভাবনা থাকে তবে নিশ্চিত হয়ে নিন যে আপনি প্রথমে পুরানো টাইমার উদাহরণটি বাতিল করে দিন। অন্যথায় আপনি টাইমারটির রেফারেন্সটি হারাবেন এবং আপনি এটি আর থামাতে পারবেন না। ( এই প্রশ্নোত্তর দেখুন )
  • যখন প্রয়োজন হবে না তখন টাইমার ব্যবহার করবেন না। আইওএস অ্যাপ্লিকেশনগুলির জন্য শক্তি দক্ষতার গাইডের টাইমার বিভাগ দেখুন ।

সম্পর্কিত


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-এ ভেঙে গেছে, উদাহরণস্বরূপ: টাইমরস্কুলিউডটাইমার (সময়কালীন আন্তঃকাল: ১.০, লক্ষ্য: স্ব, নির্বাচক: # নির্বাচক (ইভেন্ট), ইউজারআইএনফো: "তথ্য প্রেরিত", পুনরাবৃত্তি: সত্য)
ববি

28

আইওএস 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
আমার বোধগম্যতা হল যে কেবল টাইমার কলব্যাকটি মূল কাতারে থাকা উচিত এবং নিম্নলিখিতটি আরও সামান্য দক্ষ হবে: সেলফ.টিমার = টাইমরশালিউড টাইমার (টাইমআইন্টারভাল সহ: 20, পুনরাবৃত্তি: মিথ্যা) Dis DispatchQueue.main.async {মুদ্রণের টাইমার (টাইমার)}}
ম্যাথিউ ফ্রেনেট

আমার টাইমার আমার কোন একটি বিষয় থেকে ট্রিগার করছিল না এবং এটি কৌশলটি তৈরি করেছিল :)
রিমন্ড হিল

@ রিমনহিল আপনার পরিবর্তন করতে হবেtimeInterval
onwayway133

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
এখানেও, আমি ত্রুটি পেয়েছি 'সরবরাহকারী আর্গুমেন্টগুলি গ্রহণ করে' থিম 'এর জন্য একটি ওভারলোড খুঁজে পাওয়া যায়নি। এই লাইন কি সত্যিই কাজ করে?
ইয়াংশুন তায়ে

আমি @ ইয়াংশুনের মতো একই ত্রুটি পেয়েছি। কী ধরণের অবজেক্ট হতে selfহবে? ইউআইভিউ ঠিক আছে?
সিম্পলজি

@ সিম্পলএএসকোল্ডবি: হ্যাঁ ঠিক আছে
মিডহান এমপি

func পরিমাণSubmitSuccess ()। self.view.hideToastActivity () self.view.makeToast (বার্তা: "পরিমাণ সাফল্যের সাথে নিবন্ধিত") টাইম টাইম = এনএসটিআরআইএসডিউলযুক্ত টাইমারবিথটাইমইন্টারওয়াল (0.5, টার্গেট: স্ব, নির্বাচক: "মুভিটো বিডার পেজ", ইউজারআইনফো: পুনরাবৃত্তি করুন: মিথ্যা)} func moveToBidderPage () login লগইনপেইজভিউ = সেলফ স্টোরবোর্ড? বিডারপেজ সেল্ফ.বিভিশনকন্ট্রোলার? .পুশভিউ কনট্রোলার (লগইনপেজভিউ, অ্যানিমেটেড: সত্য)}
এজি

11

আপনি সুইফট 3 এ এনএসটিমারের পরিবর্তে টাইমার ব্যবহার করতে হবে ।

এখানে একটি উদাহরণ:

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
    }

সচেতন থাকুন, এটি কেবল ম্যাকোস 10.12 বা আরও নতুনতে উপলব্ধ। আইওএস সম্পর্কে নিশ্চিত নয়।
জেফ-এইচ

এটি আইওএসেও উপলব্ধ।
উইসা

7

সুইফট 3 এবং এক্সকোড 8.2 এর জন্য (ব্লক থাকতে ভাল, তবে আপনি যদি iOS9 এর জন্য সংকলন করেন এবং ব্যবহারকারীর তথ্য চান):

...

        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

সিম্পলটাইমার (সুইফট ৩.১)

কেন?

এটি দ্রুতগতিতে একটি সাধারণ টাইমার ক্লাস যা আপনাকে এতে সক্ষম করে:

  • স্থানীয় স্কোপড টাইমার
  • 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()
    }
}

তাহলে কিছু শর্তে ব্লকের ভিতরে থাকা টাইমারকে কীভাবে থামানো যায়?
মোবাইল বিকাশকারী আইওএস অ্যান্ড্রয়েড

একটি ক্লাসে টাইফারে রেফ কেবল স্টোর করুন কেবল স্টপ কল করুন। Xcode কম্পাইলার আপনাকে বলতে হবে যদি এটা অব্যাহতি ইত্যাদি প্রয়োজন
eonist

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

এবং ক্রিয়েট মজাটি তৈরি করে নামটি তৈরি করুন ne

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

3

প্রথমে আপনার টাইমার ঘোষণা করুন

var timer: Timer?

তারপরে ভিউডিডলড () বা লাইনটি যুক্ত করুন বা কোনও ফাংশনে আপনি টাইমার শুরু করতে চান

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

যদি আপনি টাইমার পদ্ধতি গ্রহণ করেন

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

আমি একটি এনএসবজেক্ট ক্লাসে করার চেষ্টা করেছি এবং এটি আমার জন্য কাজ করেছে:

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

-2

সুইচ ৪.২-তে এনএসটিমেমার নামকরণ করা হয়েছে টাইমার। এই বাক্য গঠনটি 4.2 এ কাজ করবে:

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

নতুন নামকরণটি সুইফ্ট 3-এ ঘটেছে এবং অন্যান্য উত্তর ইতিমধ্যে আপডেটটি সম্পন্ন করেছে ...
এরিক আয়া
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.