সুইফ্ট 5.1 এর সাহায্যে গ্র্যান্ড সেন্ট্রাল ডিসপ্যাচ আপনার সমস্যা সমাধানের জন্য বিভিন্ন উপায় সরবরাহ করে। আপনার প্রয়োজন অনুসারে, আপনি নিম্নলিখিত প্লেগ্রাউন্ড স্নিপেটগুলিতে প্রদর্শিত সাতটি নিদর্শনগুলির মধ্যে একটি চয়ন করতে পারেন ।
অ্যাপল বিকাশকারী কনকুরન્સી প্রোগ্রামিং গাইড সম্পর্কে এখানে বলা হয়েছেDispatchGroup :
এক বা একাধিক কার্য সম্পাদন শেষ না হওয়া পর্যন্ত প্রেরণ গোষ্ঠীগুলি থ্রেড ব্লক করার একটি উপায়। আপনি এই আচরণটি এমন জায়গাগুলিতে ব্যবহার করতে পারেন যেখানে নির্দিষ্ট সমস্ত কাজ শেষ না হওয়া পর্যন্ত আপনি অগ্রগতি করতে পারবেন না। উদাহরণস্বরূপ, কিছু ডেটা গণনা করার জন্য কয়েকটি কার্য প্রেরণের পরে, আপনি কোনও গোষ্ঠী ব্যবহার করে সেই কাজগুলির জন্য অপেক্ষা করতে পারেন এবং তারপরে ফলাফলগুলি সম্পন্ন হওয়ার পরে প্রক্রিয়া করতে পারেন।
import Foundation
import PlaygroundSupport
PlaygroundPage.current.needsIndefiniteExecution = true
let queue = DispatchQueue(label: "com.company.app.queue", attributes: .concurrent)
let group = DispatchGroup()
queue.async(group: group) {
print("#1 started")
Thread.sleep(forTimeInterval: 5)
print("#1 finished")
}
queue.async(group: group) {
print("#2 started")
Thread.sleep(forTimeInterval: 2)
print("#2 finished")
}
group.notify(queue: queue) {
print("#3 finished")
}
/*
prints:
#1 started
#2 started
#2 finished
#1 finished
#3 finished
*/
# 2। ব্যবহার DispatchGroup, DispatchGroup's wait(), DispatchGroup' গুলি enter()এবং DispatchGroupএরleave()
import Foundation
import PlaygroundSupport
PlaygroundPage.current.needsIndefiniteExecution = true
let queue = DispatchQueue(label: "com.company.app.queue", attributes: .concurrent)
let group = DispatchGroup()
group.enter()
queue.async {
print("#1 started")
Thread.sleep(forTimeInterval: 5)
print("#1 finished")
group.leave()
}
group.enter()
queue.async {
print("#2 started")
Thread.sleep(forTimeInterval: 2)
print("#2 finished")
group.leave()
}
queue.async {
group.wait()
print("#3 finished")
}
/*
prints:
#1 started
#2 started
#2 finished
#1 finished
#3 finished
*/
মনে রাখবেন আপনি এছাড়াও মিশ্রিত করা যাবে DispatchGroup wait()সঙ্গে DispatchQueue async(group:qos:flags:execute:)বা মিশ্রিত করা DispatchGroup enter()এবং DispatchGroup leave()সঙ্গে DispatchGroup notify(qos:flags:queue:execute:)।
সুইফট 4 এর জন্য গ্র্যান্ড সেন্ট্রাল ডিসপ্যাচ টিউটোরিয়াল: রায়ওয়েন্ডেলিচ ডটকমের অংশ 1/2 নিবন্ধটি বাধাগুলির জন্য একটি সংজ্ঞা দিয়েছে :
প্রেরণ বাধা হ'ল একক ক্রিয়াকলাপ যা ক্রমিক-শৈলীর বাধা হিসাবে কাজ করে যখন সমবর্তী সারির সাথে কাজ করে। আপনি যখন DispatchWorkItemকোনও প্রেরণের সারিতে একটি জমা দেন আপনি পতাকাগুলি সেট করতে পারেন তা নির্দিষ্ট করে যে নির্দিষ্ট সময়ের জন্য নির্দিষ্ট কাতারে এটিই কার্যকর করা উচিত। এর অর্থ হ'ল প্রেরণের বাধা দেওয়ার আগে কাতারে জমা সমস্ত আইটেমগুলি DispatchWorkItemকার্যকর করার আগে সম্পূর্ণ করতে হবে।
ব্যবহার:
import Foundation
import PlaygroundSupport
PlaygroundPage.current.needsIndefiniteExecution = true
let queue = DispatchQueue(label: "com.company.app.queue", attributes: .concurrent)
queue.async {
print("#1 started")
Thread.sleep(forTimeInterval: 5)
print("#1 finished")
}
queue.async {
print("#2 started")
Thread.sleep(forTimeInterval: 2)
print("#2 finished")
}
queue.async(flags: .barrier) {
print("#3 finished")
}
/*
prints:
#1 started
#2 started
#2 finished
#1 finished
#3 finished
*/
import Foundation
import PlaygroundSupport
PlaygroundPage.current.needsIndefiniteExecution = true
let queue = DispatchQueue(label: "com.company.app.queue", attributes: .concurrent)
queue.async {
print("#1 started")
Thread.sleep(forTimeInterval: 5)
print("#1 finished")
}
queue.async {
print("#2 started")
Thread.sleep(forTimeInterval: 2)
print("#2 finished")
}
let dispatchWorkItem = DispatchWorkItem(qos: .default, flags: .barrier) {
print("#3 finished")
}
queue.async(execute: dispatchWorkItem)
/*
prints:
#1 started
#2 started
#2 finished
#1 finished
#3 finished
*/
সোরেশ খানলু দ্য জিসিডি হ্যান্ডবুক ব্লগ পোস্টে নিম্নলিখিত লাইনগুলি লিখেছেন :
একটি সেমফোর ব্যবহার করে, অন্য থ্রেড থেকে একটি সংকেত না পাঠানো পর্যন্ত আমরা একটি নির্বিচার পরিমাণের জন্য একটি থ্রেড ব্লক করতে পারি। অন্যান্য জিসিডির মতো সেমোফোরগুলি থ্রেড-নিরাপদ এবং এগুলি যে কোনও জায়গা থেকে ট্রিগার করা যেতে পারে। যখন আপনাকে একটি সিঙ্ক্রোনাস তৈরি করতে হবে এমন একটি অ্যাসিনক্রোনাস এপিআই রয়েছে সেমাপোরগুলি ব্যবহার করা যেতে পারে, তবে আপনি এটি সংশোধন করতে পারবেন না।
অ্যাপল বিকাশকারী এপিআই রেফারেন্স DispatchSemaphore init(value:)ইনিশিয়ালাইজারের জন্য নিম্নলিখিত আলোচনাটি দেয় :
যখন দুটি থ্রেড নির্দিষ্ট ইভেন্টের সমাপ্তির পুনর্মিলন করা প্রয়োজন তখন মানটির জন্য শূন্য পাস করা কার্যকর। শূন্যের চেয়ে বেশি মান পাস করা সংস্থানগুলির সীমাবদ্ধ ব্যবস্থাপনার জন্য দরকারী, যেখানে পুলের আকারটি মানের সমান।
ব্যবহার:
import Foundation
import PlaygroundSupport
PlaygroundPage.current.needsIndefiniteExecution = true
let queue = DispatchQueue(label: "com.company.app.queue", attributes: .concurrent)
let semaphore = DispatchSemaphore(value: 0)
queue.async {
print("#1 started")
Thread.sleep(forTimeInterval: 5)
print("#1 finished")
semaphore.signal()
}
queue.async {
print("#2 started")
Thread.sleep(forTimeInterval: 2)
print("#2 finished")
semaphore.signal()
}
queue.async {
semaphore.wait()
semaphore.wait()
print("#3 finished")
}
/*
prints:
#1 started
#2 started
#2 finished
#1 finished
#3 finished
*/
অ্যাপল বিকাশকারী এপিআই রেফারেন্স সম্পর্কে বলা হয়েছে OperationQueue:
অপারেশন সারিগুলি libdispatchগ্রন্থাগারটি (গ্র্যান্ড সেন্ট্রাল ডিসপ্যাচ নামেও পরিচিত) তাদের ক্রিয়াকলাপ সম্পাদনের জন্য আরম্ভ করে।
ব্যবহার:
import Foundation
import PlaygroundSupport
PlaygroundPage.current.needsIndefiniteExecution = true
let operationQueue = OperationQueue()
let blockOne = BlockOperation {
print("#1 started")
Thread.sleep(forTimeInterval: 5)
print("#1 finished")
}
let blockTwo = BlockOperation {
print("#2 started")
Thread.sleep(forTimeInterval: 2)
print("#2 finished")
}
let blockThree = BlockOperation {
print("#3 finished")
}
blockThree.addDependency(blockOne)
blockThree.addDependency(blockTwo)
operationQueue.addOperations([blockThree, blockTwo, blockOne], waitUntilFinished: false)
/*
prints:
#1 started
#2 started
#2 finished
#1 finished
#3 finished
or
#2 started
#1 started
#2 finished
#1 finished
#3 finished
*/
import Foundation
import PlaygroundSupport
PlaygroundPage.current.needsIndefiniteExecution = true
let operationQueue = OperationQueue()
let blockOne = BlockOperation {
print("#1 started")
Thread.sleep(forTimeInterval: 5)
print("#1 finished")
}
let blockTwo = BlockOperation {
print("#2 started")
Thread.sleep(forTimeInterval: 2)
print("#2 finished")
}
operationQueue.addOperations([blockTwo, blockOne], waitUntilFinished: false)
operationQueue.addBarrierBlock {
print("#3 finished")
}
/*
prints:
#1 started
#2 started
#2 finished
#1 finished
#3 finished
or
#2 started
#1 started
#2 finished
#1 finished
#3 finished
*/