সুইফটে প্রতি x মিনিটে কিছু করুন


113

আমি প্রতি মিনিটে কীভাবে একটি ফাংশন চালাতে পারি? জাভাস্ক্রিপ্টে আমি এর মতো কিছু করতে পারি setInterval, সুইফটে কি অনুরূপ কিছু উপস্থিত রয়েছে?

পছন্দসই আউটপুট:

হ্যালো ওয়ার্ল্ড প্রতি মিনিটে একবার ...



আমি উদ্দেশ্য সি তে এটি কীভাবে করতে পারি?
রাদেমস ই। হার্নান্দেজ

উত্তর:


171
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")
 }

1
তবে আপনি যদি ভিউ এর মধ্যে পরিবর্তন করতে চান? কোড ঠিক থামবে?
সিং

5
@Cing নির্ভর করে স্ব কী উল্লেখ করছেন।
আন্তজি

1
ভুলে যাবেন না যে NSTimerএটি তার লক্ষ্য ধরে রেখেছে, সুতরাং, এই সেটআপটি দিয়ে, যদি আপনার নিজের helloWorldTimerসম্পত্তি থাকে তবে selfনিজেকে ধরে রাখার চক্র, যেখানে selfধরে রাখা helloWorldTimerএবং helloWorldTimerধরে রাখা যায় self
MANIAK_dobrii

@ মানিয়াক_ডোব্রি আপনি কীভাবে রক্ষণ চক্রটি ভাঙ্গতে পারেন সে সম্পর্কেও মন্তব্য করতে পারেন? যদি ভিসি বরখাস্ত হয় তবে টাইমার বাতিল না হয়, চক্রটি এখনও কৌশলটিতে আছে? সুতরাং আপনার দুজনকেই অবশ্যই টাইমারটি বাতিল করতে হবে এবং তারপরে চক্রটি ভাঙ্গার জন্য ভিউটি খারিজ করতে হবে?
ডেভ জি

1
সুইফট ৪-এর জন্য, আপনি যে পদ্ধতিতে নির্বাচককে পেতে চান তা অবশ্যই অবজেক্টি-সি-এর কাছে প্রকাশ করা উচিত, সুতরাং @objc বৈশিষ্ট্যটি পদ্ধতির ঘোষণায় যুক্ত করতে হবে। যেমন `` `@objc func sayHello () {}` ``
শামীম হোসেন

136

যদি আইওএস সংস্করণ 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প্যাটার্নের সাথে কিছু শক্তিশালী রেফারেন্স চক্রের চ্যালেঞ্জগুলি এড়িয়ে যায় ।Timerweak

তাই:

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
রব

@ রব আমার স্ক্রিনে একটি পাল্টা লেবেল রয়েছে যা একটি ফাংশন থেকে প্রতি সেকেন্ডে আপডেট হয় এবং আমি আমার কাউন্টারকে বাড়িয়ে তুলতে এবং লেবেলের পাঠ্য আপডেট করতে উপরের কোডটি ব্যবহার করছি। তবে, আমি যে সমস্যার মুখোমুখি হয়েছি তা হ'ল আমার কাউন্টার ভেরিয়েবল প্রতি সেকেন্ডে আপডেট হয়, তবে স্ক্রিনটি আমার ইউআইবিবেলে সর্বশেষতম প্রতিরূপ মান প্রদর্শন করে না।
নগেন্দ্র রাও

রাও, উপরেরটি ব্যাকগ্রাউন্ড থ্রেডে কিছু ক্রিয়া সম্পাদনের জন্য দরকারী। তবে আপনার ইউআই আপডেটগুলি অবশ্যই মূল কাতারে হবে। সুতরাং, হয় মূল থ্রেডে এটি নির্ধারণ করুন বা কমপক্ষে ইউআই আপডেটগুলি মূল থ্রেডে প্রেরণ করুন।
রব

1
এই উত্তরের মন্তব্যে এই প্রশ্নটি এখানে অন্তর্ভুক্ত নয়। উপরে আপনার মন্তব্য মুছুন এবং আপনার নিজের প্রশ্ন পোস্ট করুন। তবে, সংক্ষেপে, আপনি সাধারণত অ্যাপটিকে পটভূমিতে চলমান রাখেন না, তবে কেবল এটির মতো দেখান look স্ট্যাকওভারফ্লো . com/a/31642036/1271826 দেখুন ।
রব

17

নামের ফাংশন না করে ক্লোজার ব্যবহার করে NSTimerসুইফট 3 (যার NSTimerনামকরণ করা হয়েছিল Timer) এর উত্তরের জন্য এখানে একটি আপডেট রয়েছে :

var timer = Timer.scheduledTimer(withTimeInterval: 60, repeats: true) {
    (_) in
    print("Hello world")
}

6
এটি কেবল আইওএস 10 এর জন্য।
গ্লেন

দয়া করে
আইওএস

13

আপনি যদি কিছু সময়ের জন্য ড্রিফ্টের অনুমতি দিতে পারেন তবে এখানে প্রতি মিনিটে কিছু কোড কার্যকর করার একটি সহজ সমাধান রয়েছে:

private func executeRepeatedly() {
    // put your code here

    DispatchQueue.main.asyncAfter(deadline: .now() + 60.0) { [weak self] in
        self?.executeRepeatedly()
    }
}

কেবল executeRepeatedly()একবার চালান এবং এটি প্রতি মিনিটে কার্যকর করা হবে। মালিকানাধীন বস্তু ( self) প্রকাশিত হলে কার্যকর করা বন্ধ হয়ে যায় । আপনি একটি পতাকা ব্যবহার করতে পারেন তা বোঝাতে যে কার্যকর হওয়া বন্ধ হবে।


এই সিদ্ধান্তটি এই সমস্ত টাইমারকে কাছাকাছি রাখার চেয়ে চালকগুলিতে যুক্ত করে, তাদের অবৈধ করে দেয় ... শীতল!
জুলিয়া_ভি

এটি বৈধ সমাধান বলে মনে হচ্ছে তবে এটি আমার ওয়েব পরিষেবা কল দিয়ে ব্যবহার করার সময় এটি একটি ধরে রাখার চক্র তৈরি করছে ...
জয়ন্ত কাঁচাট

11

আপনি ব্যবহার করতে পারেন Timer(দ্রুত 3)

var timer = Timer.scheduledTimerWithTimeInterval(60, target: self, selector: Selector("function"), userInfo: nil, repeats: true)

নির্বাচক () এ আপনি নিজের ফাংশনটির নাম রেখেছেন


আপনি কীভাবে সুইফট 3 এ এটি করতে পারেন?
বাইবসি

1
ব্যবহার Timer... এর NSTimerনতুন নামকরণ করা হয়েছে
জোসেফ

7

সুইফটে 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জিপিইউ রিফ্রেশ হারের সাথে এটি সিঙ্ক্রোনাইজ হওয়ার কারণে এটি অনুসন্ধান করার পরামর্শ দিচ্ছি ।

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