সুইফট 3-এ কীভাবে একটি বিলম্ব প্রোগ্রাম করবেন


329

সুইফ্টের পূর্ববর্তী সংস্করণগুলিতে, নিম্নলিখিত কোডগুলি সহ কেউ বিলম্ব তৈরি করতে পারে:

let time = dispatch_time(dispatch_time_t(DISPATCH_TIME_NOW), 4 * Int64(NSEC_PER_SEC))
dispatch_after(time, dispatch_get_main_queue()) {
    //put your code which should be executed with a delay here
}

তবে এখন, সুইফ্ট 3-এ, এক্সকোড স্বয়ংক্রিয়ভাবে 6 টি ভিন্ন জিনিস পরিবর্তন করে তবে তারপরে নিম্নলিখিত ত্রুটিটি উপস্থিত হয়: " DispatchTime.nowপ্রত্যাশিত মান dispatch_time_tওরফে রূপান্তর করা যায় না UInt64" "

সুইফট 3-তে কোডের সিক্যুয়েন্স চালানোর আগে কীভাবে কোনও বিলম্ব তৈরি করতে পারে?

উত্তর:


965

অনেক গবেষণার পরে, অবশেষে আমি এটি এক খুঁজে পেতে।

DispatchQueue.main.asyncAfter(deadline: .now() + 2.0) { // Change `2.0` to the desired number of seconds.
   // Code you want to be delayed
}

এটি সুইফট 3 এবং সুইফ্ট 4-এ কাঙ্ক্ষিত "অপেক্ষা" প্রভাব তৈরি করে।

এই উত্তরের একটি অংশ দ্বারা অনুপ্রাণিত ।


7
দরকারী অবদান, ধন্যবাদ! অতি সাম্প্রতিক সুইফট 3 এর জন্য আপডেট হচ্ছে:DispatchQueue.main.asyncAfter(deadline: when)
রোগারে

77
আপনি "+ 2" "+ .সেকেন্ডস (2)" এর সাথে প্রতিস্থাপন করে আপনার কোডটিকে কিছুটা স্বাচ্ছন্দ্যময় করতে পারেন। অথবা, দ্রুততার মধ্যে চূড়ান্ততার জন্য, আপনি প্রথম লাইনটি ফেলে দিতে পারেন এবং "সময়সীমা: যখন" "সময়সীমার সাথে:" এখন () + সেকেন্ডস (2) "প্রতিস্থাপন করতে পারেন।
রেনিপেট

2
@ অক্টাভিওআন্টোনিওসিডেও সাহায্য করার জন্য খুশি। এটি সত্যিই আমাকে কিছুক্ষণের জন্য
ডেকে এনেছে

5
এখনও 3/12/2017 কাজ করছে। এর জন্য আপনাকে অনেক ধন্যবাদ :)
জন লিওনার্দো

3
আক্ষরিক অর্থে আমার সবচেয়ে পরিদর্শন করা পোস্ট। আসলে এই পোস্টটি মনে রাখার চেয়ে বা এটি আমার কোডে অন্য কোথাও খুঁজে পাওয়ার চেয়ে এই পোস্টটি খুঁজে পাওয়া সহজ
easier

154

আমি জিসিডির জন্য এক-লাইন স্বরলিপি পছন্দ করি এটি আরও মার্জিত:

    DispatchQueue.main.asyncAfter(deadline: .now() + 42.0) {
        // do stuff 42 seconds later
    }

এছাড়াও, আইওএস 10 এ আমাদের কাছে নতুন টাইমার পদ্ধতি রয়েছে, যেমন ব্লক ইনিশিয়ালাইজার:

(তাই বিলম্বিত ক্রিয়া বাতিল হতে পারে)

    let timer = Timer.scheduledTimer(withTimeInterval: 42.0, repeats: false) { (timer) in
        // do stuff 42 seconds later
    }

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

RunLoop.current.add(timer, forMode: .common)

এই ব্লগ পোস্টে আপনি আরও বিশদ জানতে পারেন।


4
ভালো বল ধরা! আমি এখনও এটি দেখতে পাইনি।
জুলিয়েন_সি

8
টাইমর তুলনার জন্য প্লাস ওয়ান এবং মূল রানলুপ সম্পর্কে অস্বীকৃতি!
মার্টিন

2
চমৎকার ধরা! এটি ইঞ্জিনিয়ারিং is
ওনুর indহিন্দুর

56

নীচের ফাংশনটি সুইফট ৩.০ এবং তারপরের উপর প্রয়োগ করে দেখুন

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

ব্যবহার

delayWithSeconds(1) {
   //Do something
}

5
আপনি মূলত এই উত্তরটি অনুলিপি করেছেন তবে হ্যাঁ এটি ভাল, ধন্যবাদ।
পিতৃলোকটি 21

2
কীভাবে বাতিল করবেন?
সৌরভ চন্দ্র

24

বিলম্বের জন্য নীচের কোডটি চেষ্টা করুন

//MARK: First Way

func delayForWork() {
    delay(3.0) {
        print("delay for 3.0 second")
    }
}

delayForWork()

// MARK: Second Way

DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) {
    // your code here delayed by 0.5 seconds
}

1
প্রথম উপায় প্রদর্শনগুলিতে ত্রুটি রয়েছে "অমীমাংসিত সনাক্তকারী 'বিলম্ব' এর ব্যবহার"
জেরি চং

5
এই প্রোগ্রামারটি তার কোড বেসে সাহায্যকারী পদ্ধতি নিয়ে কাজ করছে এবং এটি দীর্ঘ সময় ধরে। তাই বিলম্বটি কোডটি তিনি কিছু সময়ের জন্য ব্যবহার করেছেন এটি জেনেও না যে এটি অ্যাপলের এসডিকে বাদে নয়।
নিক পারকিনস

4

একটি উপায় হ'ল ব্যবহার করা DispatchQueue.main.asyncAfterযেমন অনেক লোক উত্তর দিয়েছিল।

অন্য উপায় ব্যবহার করা হয় perform(_:with:afterDelay:)আরও বিশদ এখানে

perform(#selector(delayedFunc), with: nil, afterDelay: 3)

@IBAction func delayedFunc() {
    // implement code
}

1

// এক্স সেকেন্ড পরে ফাংশন চালায়

public static func runThisAfterDelay(seconds: Double, after: @escaping () -> Void) {
    runThisAfterDelay(seconds: seconds, queue: DispatchQueue.main, after: after)
}

public static func runThisAfterDelay(seconds: Double, queue: DispatchQueue, after: @escaping () -> Void) {
    let time = DispatchTime.now() + Double(Int64(seconds * Double(NSEC_PER_SEC))) / Double(NSEC_PER_SEC)
    queue.asyncAfter(deadline: time, execute: after)
}

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

runThisAfterDelay(seconds: x){
  //write your code here
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.