বাক্য গঠনটি সহজভাবে:
// to run something in 0.1 seconds
DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) {
// your code here
}
দ্রষ্টব্য, উপরের সিনট্যাক্সটিকে seconds
একটি হিসাবে Double
বিভ্রান্তির উত্স হিসাবে মনে হচ্ছে (যেমন আমরা এনসিএসি যুক্ত করতে অভ্যস্ত ছিলাম)। Double
সিনট্যাক্সটি " সেকেন্ড যুক্ত হিসাবে " কাজ করে কারণ deadline
একটি DispatchTime
এবং পর্দার পিছনে এমন একটি +
অপারেটর রয়েছে যা এটি গ্রহণ করবে Double
এবং এতে অনেক সেকেন্ড যোগ করবে DispatchTime
:
public func +(time: DispatchTime, seconds: Double) -> DispatchTime
কিন্তু, আপনি যদি সত্যিই msec μs, অথবা nsec এর একটি পূর্ণসংখ্যা সংখ্যা যোগ করতে চান DispatchTime
, তবে আপনাকে একটি যোগ করতে পারেন DispatchTimeInterval
একটি থেকে DispatchTime
। এর অর্থ আপনি করতে পারেন:
DispatchQueue.main.asyncAfter(deadline: .now() + .milliseconds(500)) {
os_log("500 msec seconds later")
}
DispatchQueue.main.asyncAfter(deadline: .now() + .microseconds(1_000_000)) {
os_log("1m μs seconds later")
}
DispatchQueue.main.asyncAfter(deadline: .now() + .nanoseconds(1_500_000_000)) {
os_log("1.5b nsec seconds later")
}
ক্লাসে +
অপারেটরের জন্য এই পৃথক ওভারলোড পদ্ধতির কারণে এগুলি সমস্ত নির্বিঘ্নে কাজ করে DispatchTime
।
public func +(time: DispatchTime, interval: DispatchTimeInterval) -> DispatchTime
এটি জিজ্ঞাসা করা হয়েছিল যে কীভাবে একজন প্রেরণ করা টাস্ক বাতিল করার বিষয়ে যায়। এটি করতে, ব্যবহার করুন DispatchWorkItem
। উদাহরণস্বরূপ, এটি এমন একটি কাজ শুরু করে যা পাঁচ সেকেন্ডের মধ্যেই আগুন নেবে, বা যদি ভিউ কন্ট্রোলারকে বরখাস্ত করে এবং deinit
বাতিল করা হয়, তবে এটি কার্যটি বাতিল করে দেবে:
class ViewController: UIViewController {
private var item: DispatchWorkItem?
override func viewDidLoad() {
super.viewDidLoad()
item = DispatchWorkItem { [weak self] in
self?.doSomething()
self?.item = nil
}
DispatchQueue.main.asyncAfter(deadline: .now() + 5, execute: item!)
}
deinit {
item?.cancel()
}
func doSomething() { ... }
}
[weak self]
ক্যাপচার তালিকার ব্যবহারটি নোট করুন DispatchWorkItem
। একটি শক্তিশালী রেফারেন্স চক্র এড়ানোর জন্য এটি প্রয়োজনীয়। এছাড়াও মনে রাখবেন যে এটি একটি প্রাক্প্রটিভ বাতিল করতে পারে না, বরং কাজটি এটি ইতিমধ্যে যদি না করে শুরু করে তবে থামায় starting তবে যদি এটি cancel()
কলটির মুখোমুখি হওয়ার সময়ের মধ্যে ইতিমধ্যে শুরু হয়ে যায় , তবে ব্লকটি কার্যকর করা শেষ করবে (যদি আপনি নিজে isCancelled
ব্লকের ভিতরে যাচাই করেন না)।