আমি প্রতি মিনিটে কীভাবে একটি ফাংশন চালাতে পারি? জাভাস্ক্রিপ্টে আমি এর মতো কিছু করতে পারি setInterval
, সুইফটে কি অনুরূপ কিছু উপস্থিত রয়েছে?
পছন্দসই আউটপুট:
হ্যালো ওয়ার্ল্ড প্রতি মিনিটে একবার ...
আমি প্রতি মিনিটে কীভাবে একটি ফাংশন চালাতে পারি? জাভাস্ক্রিপ্টে আমি এর মতো কিছু করতে পারি setInterval
, সুইফটে কি অনুরূপ কিছু উপস্থিত রয়েছে?
পছন্দসই আউটপুট:
হ্যালো ওয়ার্ল্ড প্রতি মিনিটে একবার ...
উত্তর:
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
।
যদি আইওএস সংস্করণ 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()
}
আরো তথ্যের জন্য, দেখুন একটি টাইমার তৈরি করা হচ্ছে বিভাগে ডিসপ্যাচ উত্স উদাহরণ মধ্যে ডিসপ্যাচ সোর্স বিভাগে concurrency প্রোগ্রামিং গাইড।
সুইফট 2 এর জন্য, এই উত্তরের পূর্ববর্তী সংশোধনটি দেখুন ।
dispatch_after
। বা একটি পুনরাবৃত্তি না NSTimer
।
আপনি যদি কিছু সময়ের জন্য ড্রিফ্টের অনুমতি দিতে পারেন তবে এখানে প্রতি মিনিটে কিছু কোড কার্যকর করার একটি সহজ সমাধান রয়েছে:
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
জিপিইউ রিফ্রেশ হারের সাথে এটি সিঙ্ক্রোনাইজ হওয়ার কারণে এটি অনুসন্ধান করার পরামর্শ দিচ্ছি ।