প্রেরণ_পরীক্ষা - সুইফটে জিসিডি?


558

আমি পেরিয়েছি অ্যাপল থেকে আইবুক , এবং এর কোনও সংজ্ঞা পাইনি:

এর কাঠামো কি কেউ ব্যাখ্যা করতে পারেন dispatch_after?

dispatch_after(<#when: dispatch_time_t#>, <#queue: dispatch_queue_t?#>, <#block: dispatch_block_t?#>)

1
অ্যাপল এই বইটি 2018 সালে অপ্রকাশিত। আমি খুঁজে পেতে পারি সর্বশেষ সংরক্ষণাগারটি ডিসেম্বর 2017 এর । আইবুকের পুরানো লিঙ্কগুলি এখন কেবল ডেভেলপার.অ্যাপল . com/ ডকুমেন্টেশন / সুইফটে পুনঃনির্দেশ করুন ।
Cœur

উত্তর:


742

কাঠামোর একটি পরিষ্কার ধারণা:

dispatch_after(when: dispatch_time_t, queue: dispatch_queue_t, block: dispatch_block_t?)

dispatch_time_tএকটি UInt64dispatch_queue_tআসলে একটি ওরফে অন্য ধরনের NSObject, কিন্তু আপনি শুধু সারি পেতে আপনার পরিচিত GCD পদ্ধতি ব্যবহার করা উচিত। ব্লকটি একটি সুইফট বন্ধ। বিশেষত, dispatch_block_tহিসাবে সংজ্ঞায়িত করা হয় () -> Void, যা সমান () -> ()

ব্যবহারের উদাহরণ:

let delayTime = dispatch_time(DISPATCH_TIME_NOW, Int64(1 * Double(NSEC_PER_SEC)))
dispatch_after(delayTime, dispatch_get_main_queue()) {
    print("test")
}

সম্পাদনা করুন:

আমি @ ম্যাট এর সত্যিই দুর্দান্ত delayফাংশন ব্যবহার করার পরামর্শ দিচ্ছি ।

সম্পাদনা 2:

সুইফ্ট 3-তে, জিসিডির জন্য নতুন নতুন মোড়ক থাকবে। এখানে দেখুন: https://github.com/apple/swift-evolution/blob/master/proposals/0088-libdispatch-for-swift3.md

আসল উদাহরণটি সুইফট 3 এ নিম্নরূপ লিখিত হবে:

let deadlineTime = DispatchTime.now() + .seconds(1)
DispatchQueue.main.asyncAfter(deadline: deadlineTime) {
    print("test")
}

নোট করুন যে আপনি deadlineTimeঘোষণাটি লিখতে পারেন DispatchTime.now() + 1.0এবং একই ফলাফল পেতে পারেন কারণ +অপারেটরটি নিম্নরূপে ওভাররাইড করা হয়েছে (একইভাবে এর জন্য -):

  • func +(time: DispatchTime, seconds: Double) -> DispatchTime
  • func +(time: DispatchWalltime, interval: DispatchTimeInterval) -> DispatchWalltime

এর অর্থ হ'ল আপনি যদি এই DispatchTimeInterval enumসংখ্যাটি ব্যবহার না করে এবং কেবল একটি সংখ্যা লিখেন তবে ধরে নেওয়া হয় আপনি সেকেন্ড ব্যবহার করছেন।


17
টিপ: যেহেতু ব্লকটি ফাংশনের চূড়ান্ত পরামিতি, আপনি অতিরিক্ত পাঠযোগ্যতার জন্য সুইফটের "ট্রেলিং ক্লোজার" সিনট্যাক্সটি ব্যবহার করতে পারেন:dispatch_after(1, dispatch_get_main_queue()) { println("test") }
বিল

8
আমি নম্বর ব্যবহার করে মনে 1মধ্যে dispatch_after(1, ...এখানে বিভ্রান্তির অনেক কারণ হতে পারে। লোকেরা ভাববে এটি বেশিরভাগ সেকেন্ড, যখন এটি আসলে ন্যানো-সেকেন্ড । এই নম্বরটি কীভাবে সঠিকভাবে তৈরি করা যায় সে সম্পর্কে আমি @ ব্র্যান্ডির উত্তর দেখুন বলে পরামর্শ দিই।
হ্লুং

3
দয়া করে পরিবর্তন 1করুন dispatch_time(DISPATCH_TIME_NOW, Int64(1 * Double(NSEC_PER_SEC)))কারণ এটি বিভ্রান্তির দিকে নিয়ে যায়। লোকেরা ভাবতে পারে যে আপনার
সুইফটে

4
সুইফট 3 সংস্করণটি কাজ করছে বলে মনে হচ্ছে না। এটি অভিযোগ করে যে Binary operator '+' cannot be applied to operands of type DispatchTime and '_'লাইনে রয়েছেlet delayTime = DispatchTime.now() + .seconds(1.0)
অ্যান্ডি ইবনেজ

9
এটি পুনরায় লেখার DispatchTime.now() + 1.0জন্য এটি কাজ করার একমাত্র উপায় বলে মনে হচ্ছে (প্রয়োজন নেই .seconds)
অ্যান্ডি ইবনেজ

1092

আমি dispatch_afterপ্রায়শই ব্যবহার করি যে সিন্টেক্সটি আরও সহজ করার জন্য আমি একটি শীর্ষ-স্তরের ইউটিলিটি ফাংশন লিখেছিলাম:

func delay(delay:Double, closure:()->()) {
    dispatch_after(
        dispatch_time(
            DISPATCH_TIME_NOW,
            Int64(delay * Double(NSEC_PER_SEC))
        ),
        dispatch_get_main_queue(), closure)
}

এবং এখন আপনি এই জাতীয় কথা বলতে পারেন:

delay(0.4) {
    // do stuff
}

বাহ, এমন একটি ভাষা যেখানে আপনি ভাষা উন্নতি করতে পারেন। এর চেয়ে ভাল আর কী হতে পারে?


সুইফট 3, এক্সকোড 8 বীজ 6 এর জন্য আপডেট

তারা কলিং সিনট্যাক্সটি আরও উন্নত করে এখন এ নিয়ে বিরক্ত করার মতো উপযুক্ত নয় বলে মনে হচ্ছে:

func delay(_ delay:Double, closure:@escaping ()->()) {
    let when = DispatchTime.now() + delay
    DispatchQueue.main.asyncAfter(deadline: when, execute: closure)
}

2
দেরী গণনার জন্য আমার কেবল শর্টকাট দরকার ছিল, শেষ হয়েছিল:func delayInSec(delay: Double) -> dispatch_time_t { return dispatch_time(DISPATCH_TIME_NOW, Int64(delay * Double(NSEC_PER_SEC))) }
অ্যাভিয়েল গ্রস

4
@ agf119105 যদি আপনার বন্ধের মধ্যে কোডের কেবল একটি লাইন থাকে তবে কোডের অন্য একটি লাইন যুক্ত করুন (উদাঃ return)।
ম্যাট 21

2
@ গ্যাস্টনএম অপ্রাসঙ্গিক। কোনও ক্রিয়াকলাপ পাস করার কোনও স্মৃতি পরিচালনার সমস্যা নেই।
ম্যাট

7
"এমন একটি ভাষা যেখানে আপনি ভাষা উন্নতি করতে পারেন"। আমি বুঝতে পারি না যে কোনও বিশ্বব্যাপী ফাংশন সংজ্ঞায়িতকরণ কীভাবে ভাষার উন্নতি করছে, বা কেন এটি সি তেও কার্যকর নয়। সম্ভবত আপনি যদি কোনও অপারেটরকে ওভারলোড করেন;)1.0 ~~ { code...}
ইয়র্ক

8
আপনার উত্তরের সঠিকতা নিয়ে প্রশ্ন তোলা হচ্ছে না — তবে "আমি প্রায়শই প্রেরণ_পরে ব্যবহার করি না " এমন কোনও কোডের গন্ধ যা কোনও সুবিধার ফাংশন না দিয়ে লড়াই করা সবচেয়ে ভাল ?
নিকোলাই রুহে

127

সুইফট 3+

এটি সুইফট 3+ তে অতি-সহজ এবং মার্জিত:

DispatchQueue.main.asyncAfter(deadline: .now() + 4.5) {
    // ...
}

পুরানো উত্তর:

1 ন্যানোসেকেন্ডের পরে কার্যকর হবে যা সেজারির উত্তরটি প্রসারিত করতে, আমাকে সাড়ে 4 সেকেন্ড পরে কার্যকর করতে নিম্নলিখিতগুলি করতে হয়েছিল do

let delay = 4.5 * Double(NSEC_PER_SEC)
let time = dispatch_time(DISPATCH_TIME_NOW, Int64(delay))
dispatch_after(time, dispatch_get_main_queue(), block)

সম্পাদনা: আমি আবিষ্কার করেছি যে আমার মূল কোডটি কিছুটা ভুল ছিল। অন্তর্ভুক্ত টাইপিং একটি সংকলন ত্রুটির কারণ যদি আপনি NSEC_PER_SEC কে একটি ডাবলে না ফেলে।

যদি কেউ আরও অনুকূল সমাধানের পরামর্শ দিতে পারে তবে আমি এটি শুনতে আগ্রহী।


আমি অবহিত API এর সাথে একটি সংকলক ত্রুটি পেয়েছি dispatch_get_current_queue()। আমি dispatch_get_main_queue()পরিবর্তে ব্যবহার ।
ডেভিড এল

@ ডেভিডএল - ধন্যবাদ, dispatch_get_main_queue()অবশ্যই আপনার ব্যবহার করা উচিত। আপডেট হবে।
brindy

আমি সুইফট 3 সহ একটি খেলার মাঠে এটি চেষ্টা করেছি এবং এটি কার্যকর হয় না
22.২২

@ গ্যালাক্সান্দার আমার জন্য কাজ করে। আপনি কি খেলার মাঠটিকে অনির্দিষ্টকালের জন্য সম্পাদনের অনুমতি দিচ্ছেন?
brindy

আহ, ভাল না, আমি কয়েক ঘন্টা চালাতে দেব এবং এখনও কিছু মুদ্রিত হয়নি। এখানে আমি কি ব্যবহার করেছি। "আমদানি প্রেরণ আমদানি ডারউইন আমদানি করগ্রাফিক্সের ডিসপ্যাচকিউ.মিন.স্যানসিএফটার (শেষ সময়:। এখন () + 4.5) {"
λαβέ.λαβέ

83

ম্যাটটির বাক্য গঠনটি খুব সুন্দর এবং যদি আপনার ব্লকটি অবৈধ করার দরকার হয় তবে আপনি এটি ব্যবহার করতে পারেন:

typealias dispatch_cancelable_closure = (cancel : Bool) -> Void

func delay(time:NSTimeInterval, closure:()->Void) ->  dispatch_cancelable_closure? {

    func dispatch_later(clsr:()->Void) {
        dispatch_after(
            dispatch_time(
                DISPATCH_TIME_NOW,
                Int64(time * Double(NSEC_PER_SEC))
            ),
            dispatch_get_main_queue(), clsr)
    }

    var closure:dispatch_block_t? = closure
    var cancelableClosure:dispatch_cancelable_closure?

    let delayedClosure:dispatch_cancelable_closure = { cancel in
        if closure != nil {
            if (cancel == false) {
                dispatch_async(dispatch_get_main_queue(), closure!);
            }
        }
        closure = nil
        cancelableClosure = nil
    }

    cancelableClosure = delayedClosure

    dispatch_later {
        if let delayedClosure = cancelableClosure {
            delayedClosure(cancel: false)
        }
    }

    return cancelableClosure;
}

func cancel_delay(closure:dispatch_cancelable_closure?) {

    if closure != nil {
        closure!(cancel: true)
    }
}

অনুসরণ হিসাবে ব্যবহার করুন

let retVal = delay(2.0) {
    println("Later")
}
delay(1.0) {
    cancel_delay(retVal)
}

ক্রেডিট

উপরের লিঙ্কটি নিচে বলে মনে হচ্ছে। গিথুব থেকে আসল ওবজ্যাক কোড


1
একটি সম্পাদনা বৈশিষ্ট্য যা সঞ্চালনকারীতে রয়েছে: ডিলে পরে এটি বাতিল করার ক্ষমতা। কেবলমাত্র এই সমাধানটিই সমস্যাটি কভার করে। ধন্যবাদ
হটজার্ড

@ হটজার্ড নোট যা performSelector:afterDelay:এখন সুইফট 2 এ উপলব্ধ, তাই আপনি এটি বাতিল করতে পারেন।
ম্যাট

@ ম্যাট কিন্তু এটি কেবল এনএসবজেক্টের জন্য উপলব্ধ, তাইনা?
হটজার্ড 13

@ হটজার্ড শিওর তবে এটি না পাওয়ার চেয়ে ভাল। আমি সেখানে কোন ইস্যু দেখতে পাচ্ছি না। তবে, এই উত্তরটির মতোই, আমি ইতিমধ্যে একটি জিসিডি ভিত্তিক বাতিলকরণযোগ্য টাইমার লিখে এটির ক্ষতিপূরণ দিয়েছিলাম (এটি ব্যবহার করে dispatch_source_t, কারণ এটি আপনি বাতিল করতে পারেন)।
ম্যাট

2
অনেক অনেক ধন্যবাদ, আমি এটি সুইফট ২.৩ পর্যন্ত ব্যবহার করেছি। সুইফট ৩.০ সংকলক এখন অভিযোগ করছে, আপনি নিজের উত্তরটি আপডেট করলে দুর্দান্ত হবে!
নোটোমেটিক

27

স্যুইফ্ট 3.0.০ এবং সুইফট ৫.০ এবং সুইফ্ট ৫.০ এর সর্বাধিক সমাধান

func delayWithSeconds(_ seconds: Double, completion: @escaping () -> ()) {
    DispatchQueue.main.asyncAfter(deadline: .now() + seconds) { 
        completion()
    }
}

ব্যবহার

delayWithSeconds(1) {
   //Do something
}

22

অবজেক্টিভ-সি এর জন্য অ্যাপলের একটি প্রেরণ_পরবর্তী স্নিপেট রয়েছে :

dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(<#delayInSeconds#> * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
    <#code to be executed after a specified delay#>
});

এখানে একই স্নিপেটটি সুইফট 3 এ পোর্ট করা হয়েছে :

DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + <#delayInSeconds#>) {
  <#code to be executed after a specified delay#>
}

14

আরেকটি উপায় হ'ল এর মতো দ্বিগুণ প্রসারিত করুন:

extension Double {
   var dispatchTime: dispatch_time_t {
       get {
           return dispatch_time(DISPATCH_TIME_NOW,Int64(self * Double(NSEC_PER_SEC)))
       }
   }
}

তারপরে আপনি এটি ব্যবহার করতে পারেন:

dispatch_after(Double(2.0).dispatchTime, dispatch_get_main_queue(), { () -> Void in
            self.dismissViewControllerAnimated(true, completion: nil)
    })

আমি ম্যাটটির বিলম্বের ফাংশনটি পছন্দ করি তবে পছন্দের বাইরে আমি বরং কাছাকাছি পাস বন্ধ করে দেওয়া সীমাবদ্ধ করি।


8

সুইফট ৩.০ এ

প্রেরণ সারি

  DispatchQueue(label: "test").async {
        //long running Background Task
        for obj in 0...1000 {
            print("async \(obj)")
        }

        // UI update in main queue
        DispatchQueue.main.async(execute: { 
            print("UI update on main queue")
        })

    }

    DispatchQueue(label: "m").sync {
        //long running Background Task
        for obj in 0...1000 {
            print("sync \(obj)")
        }

        // UI update in main queue
        DispatchQueue.main.sync(execute: {
            print("UI update on main queue")
        })
    }

5 সেকেন্ড পরে প্রেরণ

    DispatchQueue.main.after(when: DispatchTime.now() + 5) {
        print("Dispatch after 5 sec")
    }

4

সুইফট 3.0 সংস্করণ

ক্লোজার ফাংশন অনুসরণ করে মূল থ্রেডে বিলম্বের পরে কিছু কাজ সম্পাদন করে।

func performAfterDelay(delay : Double, onCompletion: @escaping() -> Void){

    DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + delay, execute: {
       onCompletion()
    })
}

এই ফাংশনটি কল করুন:

performAfterDelay(delay: 4.0) {
  print("test")
}

4

1) এই পদ্ধতিটি ইউআইভিউউকন্ট্রোলার এক্সটেনশনের অংশ হিসাবে যুক্ত করুন।

extension UIViewController{
func runAfterDelay(delay: NSTimeInterval, block: dispatch_block_t) {
        let time = dispatch_time(DISPATCH_TIME_NOW, Int64(delay * Double(NSEC_PER_SEC)))
        dispatch_after(time, dispatch_get_main_queue(), block)
    }
}

ভিসিতে এই পদ্ধতিটি কল করুন:

    self.runAfterDelay(5.0, block: {
     //Add code to this block
        print("run After Delay Success")
    })

2)

performSelector("yourMethod Name", withObject: nil, afterDelay: 1)

3)

override func viewWillAppear(animated: Bool) {

dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 2), dispatch_get_main_queue(), { () -> () in
    //Code Here
})

// কমপ্যাক্ট ফর্ম

dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 2), dispatch_get_main_queue()) {
    //Code here
 }
}

3

যদিও ওপি কর্তৃক মূল প্রশ্নটি নয়, কিছু NSTimerসম্পর্কিত প্রশ্ন এই প্রশ্নের সদৃশ হিসাবে চিহ্নিত হয়েছে, সুতরাং এটি অন্তর্ভুক্ত সহ মূল্যবানNSTimer এখানে উত্তর ।

NSTimer বনাম dispatch_after

  • NSTimerআরও উচ্চ স্তরের এবং dispatch_afterআরও নিম্ন স্তরের।
  • NSTimerবাতিল করা সহজ। বাতিলকরণে আরও কোডdispatch_after লেখার প্রয়োজন ।

সাথে একটি কাজ বিলম্ব NSTimer

একটি NSTimerউদাহরণ তৈরি করুন ।

var timer = NSTimer()

আপনার যে বিলম্ব প্রয়োজন তা দিয়ে টাইমারটি শুরু করুন।

// invalidate the timer if there is any chance that it could have been called before
timer.invalidate()
// delay of 2 seconds
timer = NSTimer.scheduledTimerWithTimeInterval(2.0, target: self, selector: #selector(delayedAction), userInfo: nil, repeats: false) 

বিলম্বের পরে ডাকা একটি ফাংশন যুক্ত করুন ( selectorউপরের প্যারামিটারের জন্য আপনি যে নামটি ব্যবহার করেছেন )।

func delayedAction() {
    print("Delayed action has now started."
}

মন্তব্য

  • আপনার যদি ক্রিয়াটি হওয়ার আগে এটি বাতিল করতে হয়, কেবল কল করুন timer.invalidate()
  • পুনরাবৃত্তি কর্মের ব্যবহারের জন্য repeats: true
  • যদি আপনার কোনও ওয়ান টাইম ইভেন্ট থাকে যা বাতিল করার দরকার নেই তবে timerইনস্ট্যান্স ভেরিয়েবলটি তৈরি করার দরকার নেই । নিম্নলিখিতগুলি যথেষ্ট হবে:

    NSTimer.scheduledTimerWithTimeInterval(2.0, target: self, selector: #selector(delayedAction), userInfo: nil, repeats: false) 
  • আমার পূর্ণ উত্তর এখানে দেখুন


3

একাধিক ফাংশন জন্য এটি ব্যবহার করুন। স্থির ফাংশন বা কোনও ইউআই আপডেটের জন্য অ্যানিমেশন বা ক্রিয়াকলাপ লোডার ব্যবহার করতে এটি খুব সহায়ক।

DispatchQueue.main.asyncAfter(deadline: .now() + 0.9) {
            // Call your function 1
            DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) {
                // Call your function 2
            }
        }

উদাহরণস্বরূপ - টেবিলভিউ পুনরায় লোড হওয়ার আগে একটি অ্যানিমেশন ব্যবহার করুন। বা অ্যানিমেশনের পরে অন্য কোনও ইউআই আপডেট।

*// Start your amination* 
self.startAnimation()
DispatchQueue.main.asyncAfter(deadline: .now() + 0.9) {
                *// The animation will execute depending on the delay time*
                self.stopAnimation()
                DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) {
                    *// Now update your view*
                     self.fetchData()
                     self.updateUI()
                }
            }

2

এটি আমার পক্ষে কাজ করেছে।

সুইফট 3:

let time1 = 8.23
let time2 = 3.42

// Delay 2 seconds

DispatchQueue.main.asyncAfter(deadline: .now() + 2.0) {
    print("Sum of times: \(time1 + time2)")
}

উদ্দেশ্য গ:

CGFloat time1 = 3.49;
CGFloat time2 = 8.13;

// Delay 2 seconds

dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
    CGFloat newTime = time1 + time2;
    NSLog(@"New time: %f", newTime);
});

2

সুইফট 3 এবং 4:

আপনি ডিসপ্যাচকিউতে একটি এক্সটেনশন তৈরি করতে পারেন এবং ফাংশন বিলম্ব করতে পারেন যা ডিসপ্যাচকিউ asyncAfter ফাংশন অভ্যন্তরীণভাবে ব্যবহার করে

extension DispatchQueue {
    static func delay(_ delay: DispatchTimeInterval, closure: @escaping () -> ()) {
        let timeInterval = DispatchTime.now() + delay
        DispatchQueue.main.asyncAfter(deadline: timeInterval, execute: closure)
    }
}

ব্যবহার করুন:

DispatchQueue.delay(.seconds(1)) {
    print("This is after delay")
}

1

আপনার কোডটি বিলম্বিত করার জন্য আরেকটি সহায়ক যা ব্যবহারের ক্ষেত্রে 100% সুইফ্ট এবং delayedচ্ছিকভাবে আপনার বিলম্বিত কোডটি চালানোর জন্য একটি আলাদা থ্রেড চয়ন করার অনুমতি দেয় :

public func delay(bySeconds seconds: Double, dispatchLevel: DispatchLevel = .main, closure: @escaping () -> Void) {
    let dispatchTime = DispatchTime.now() + seconds
    dispatchLevel.dispatchQueue.asyncAfter(deadline: dispatchTime, execute: closure)
}

public enum DispatchLevel {
    case main, userInteractive, userInitiated, utility, background
    var dispatchQueue: DispatchQueue {
        switch self {
        case .main:                 return DispatchQueue.main
        case .userInteractive:      return DispatchQueue.global(qos: .userInteractive)
        case .userInitiated:        return DispatchQueue.global(qos: .userInitiated)
        case .utility:              return DispatchQueue.global(qos: .utility)
        case .background:           return DispatchQueue.global(qos: .background)
        }
    }
}

এখন আপনি কেবল মূল থ্রেডে নিজের কোডটি বিলম্ব করুন :

delay(bySeconds: 1.5) { 
    // delayed code
}

আপনি যদি নিজের কোডটি অন্য কোনও থ্রেডে বিলম্ব করতে চান :

delay(bySeconds: 1.5, dispatchLevel: .background) { 
    // delayed code that will run on background thread
}

আপনি যদি এমন কোনও ফ্রেমওয়ার্ক পছন্দ করেন যাতে আরও কিছু সুবিধাজনক বৈশিষ্ট্য রয়েছে তবে হ্যান্ডি সুইফট চেকআউট করুন । আপনি এটি কার্টেজের মাধ্যমে আপনার প্রকল্পে যুক্ত করতে পারেন তবে উপরের উদাহরণগুলির মতো একে একে ব্যবহার করুন যেমন:

import HandySwift    

delay(bySeconds: 1.5) { 
    // delayed code
}

1

আমি সবসময় ফাংশনের পরিবর্তে এক্সটেনশন ব্যবহার করতে পছন্দ করি।

সুইফট 4

public extension DispatchQueue {

  private class func delay(delay: TimeInterval, closure: @escaping () -> Void) {
    let when = DispatchTime.now() + delay
    DispatchQueue.main.asyncAfter(deadline: when, execute: closure)
  }

  class func performAction(after seconds: TimeInterval, callBack: @escaping (() -> Void) ) {
    DispatchQueue.delay(delay: seconds) {
      callBack()
    }
  }

}

অনুসরণ হিসাবে ব্যবহার করুন।

DispatchQueue.performAction(after: 0.3) {
  // Code Here
}

1

সুইফটে asyncAfter ব্যবহার করে জিসিডি কলটি বিলম্ব করছে

let delayQueue = DispatchQueue(label: "com.theappmaker.in", qos: .userInitiated)
let additionalTime: DispatchTimeInterval = .seconds(2)

আমরা ** মাইক্রোসেকেন্ড , মিলিসেকেন্ড , ন্যানোসেকেন্ড হিসাবে বিলম্ব করতে পারি

delayQueue.asyncAfter(deadline: .now() + 0.60) {
    print(Date())
}

delayQueue.asyncAfter(deadline: .now() + additionalTime) {
    print(Date())
}

1

ইন সুইফট 4

এই স্নিপেট ব্যবহার করুন:

    let delayInSec = 1.0
    DispatchQueue.main.asyncAfter(deadline: .now() + delayInSec) {
       // code here
       print("It works")
    }

এটি ইতিমধ্যে অন্যান্য উত্তরে রয়েছে (ব্রেন্ডির উদাহরণস্বরূপ, বা রাহুলের) ... একই বাক্য গঠন ...
এরিক আয়া ২

1
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(10 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
    // ...
});

dispatch_after(_:_:_:)ফাংশন তিন প্যারামিটার নেয়:

বিলম্ব
একটি প্রেরণ সারি
একটি ব্লক বা বন্ধ

dispatch_after(_:_:_:)ফাংশন অবরোধ করা বা প্রেরণ কিউ যে একটি প্রদত্ত বিলম্বের পর ফাংশন পাস করা হয়েছে উপর অবসান ডাকে। মনে রাখবেন যে dispatch_time(_:_:)ফাংশনটি ব্যবহার করে বিলম্ব তৈরি হয়েছে । এটি মনে রাখবেন কারণ আমরা সুইফটেও এই ফাংশনটি ব্যবহার করি।

আমি রায়উেন্ডারলিচ ডিসপ্যাচ টিউটোরিয়াল টিউটোরিয়ালটি দিয়ে যাওয়ার পরামর্শ দিই


1

সুইফ্ট 5-এ, নীচে ব্যবহার করুন:

 DispatchQueue.main.asyncAfter(deadline: .now() + 0.2, execute: closure) 

// time gap, specify unit is second
DispatchQueue.main.asyncAfter(deadline: .now() + .seconds(2)) {
            Singleton.shared().printDate()
        }
// default time gap is second, you can reduce it
    DispatchQueue.main.asyncAfter(deadline: .now() + 0.2) {
          // just do it!
    }

0

২.০ সেকেন্ড পরে কিছু UI সম্পর্কিত কাজ সম্পাদন করতে এই কোডটি ব্যবহার করুন।

            let delay = 2.0
            let delayInNanoSeconds = dispatch_time(DISPATCH_TIME_NOW, Int64(delay * Double(NSEC_PER_SEC)))
            let mainQueue = dispatch_get_main_queue()

            dispatch_after(delayInNanoSeconds, mainQueue, {

                print("Some UI related task after delay")
            })

সুইফট 3.0 সংস্করণ

ক্লোজার ফাংশন অনুসরণ করে মূল থ্রেডে বিলম্বের পরে কিছু কাজ সম্পাদন করে।

func performAfterDelay(delay : Double, onCompletion: @escaping() -> Void){

    DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + delay, execute: {
       onCompletion()
    })
}

এই ফাংশনটি কল করুন:

performAfterDelay(delay: 4.0) {
  print("test")
}

1
এটি পূর্ববর্তী উত্তরের সাথে প্রায় একই রকম
ড্যানিয়েল গালাসকো

দেখে মনে হচ্ছে এই উত্তরটি 2016 সালের প্রথম দিকে করা হয়েছিল এবং এটি কমপক্ষে অন্যান্য 6 টি উত্তরের চেয়ে পুরনো ..
এহারো 2

0

সুইফটে গ্র্যান্ড সেন্ট্রাল ডিসপ্যাচ (জিসিডি) এ অ্যাসিনক্রোনাস প্রেরণের জন্য সিনট্যাকটিক চিনির চেয়ে এখন বেশি।

পডফিল যোগ করুন

pod 'AsyncSwift'

তারপরে, আপনি এটি এটি ব্যবহার করতে পারেন।

let seconds = 3.0
Async.main(after: seconds) {
print("Is called after 3 seconds")
}.background(after: 6.0) {
print("At least 3.0 seconds after previous block, and 6.0 after Async code is called")
}

অ্যাপল আমাদের সকলকে কয়েকটি লাইনে জিসিডি ব্যবহারের প্রয়োজনীয়তা দিয়েছে। শুঁটি, কর্মক্ষেত্র ইত্যাদি নিয়ে কেন বিরক্ত হবে? @ এস্কেপিং এবং ক্যাপচারিং সম্পর্কে ডক্সটি কেবল পড়ুন। যথেষ্ট হইছে.
ingconti


0

এখানে সুইফটে asyncAfter এর সিঙ্ক্রোনাস সংস্করণ রয়েছে:

let deadline = DispatchTime.now() + .seconds(3)
let semaphore = DispatchSemaphore.init(value: 0)
DispatchQueue.global().asyncAfter(deadline: deadline) {
    dispatchPrecondition(condition: .onQueue(DispatchQueue.global()))
    semaphore.signal()
}

semaphore.wait()

অ্যাসিক্রোনাস এক সহ:

let deadline = DispatchTime.now() + .seconds(3)
DispatchQueue.main.asyncAfter(deadline: deadline) {
    dispatchPrecondition(condition: .onQueue(DispatchQueue.global()))
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.