OperationQueue হল iOS এবং macOS এ একটি উচ্চ-স্তরের টাস্ক কিউ যা Grand Central Dispatch এর উপরে নির্মিত। Apple Developer Documentation, 2026 অনুসারে, OperationQueue Operation-এর ইনস্ট্যান্স পরিচালনা করে — অবজেক্ট যা কাজের একটি ইউনিট এনক্যাপসুলেট করে। DispatchQueue-এর বিপরীতে, OperationQueue অপারেশনের মধ্যে ডিপেন্ডেন্সি, প্রায়োরিটি, KVO পর্যবেক্ষণ এবং চলমান টাস্ক বাতিল করা সমর্থন করে। OperationQueue স্বয়ংক্রিয়ভাবে একটি থ্রেড পুল পরিচালনা করে, সিস্টেমের উপলব্ধ রিসোর্স জুড়ে অপারেশন বিতরণ করে।
মূল পয়েন্ট
OperationQueue হল Foundation ফ্রেমওয়ার্কের একটি ক্লাস যা Operation অবজেক্টের নির্বাহ পরিচালনা করে। DispatchQueue-এর বিপরীতে, OperationQueue-কে সিরিয়াল বা কনকারেন্ট মোড স্পষ্টভাবে উল্লেখ করার প্রয়োজন নেই — একসাথে নির্বাহিত অপারেশনের সংখ্যা maxConcurrentOperationCount প্রপার্টি দ্বারা নিয়ন্ত্রিত হয়। মান 1 কিউকে সিকোয়েন্সিয়াল করে, অন্য যেকোনো মান এটিকে কনকারেন্ট করে।
Operation একটি অ্যাবস্ট্রাক্ট ক্লাস যা কাজের একটি ইউনিট উপস্থাপন করে। প্রতিটি অপারেশনের একটি অবস্থা আছে: ready, executing, finished বা cancelled। অবস্থাগুলি KVO (Key-Value Observing) এর সাথে সামঞ্জস্যপূর্ণ, যা পরিবর্তনে প্রতিক্রিয়া জানাতে দেয় — উদাহরণস্বরূপ, একটি অপারেশন সম্পূর্ণ হলে UI আপডেট করা। Operation স্বয়ংক্রিয়ভাবে isExecuting এবং isFinished ফ্ল্যাগ পরিচালনা করে।
Apple (2026) অনুসারে, OperationQueue অভ্যন্তরীণভাবে GCD ব্যবহার করে কিন্তু DispatchQueue-তে উপলব্ধ নয় এমন কার্যকারিতা যোগ করে: অপারেশনের ডিপেন্ডেন্সি, প্রায়োরিটি এবং বাতিলকরণ। যদি অ্যাপ ব্যাকগ্রাউন্ডে যায়, OperationQueue নির্বাহ স্থগিত করে এবং ফিরে এলে পুনরায় শুরু করে। OperationQueue স্বয়ংক্রিয়ভাবে CPU কোরের সংখ্যাও বিবেচনা করে এবং থ্রেডের সর্বোত্তম সংখ্যা নির্বাচন করে।
প্রতিটি অপারেশন চারটি অবস্থার মধ্য দিয়ে যায়: pending (অপেক্ষমাণ), ready (প্রস্তুত), executing (নির্বাহ চলছে) এবং finished (সম্পূর্ণ)। cancelled অবস্থা সম্পূর্ণ হওয়ার আগে যেকোনো পর্যায়ে ঘটতে পারে। অবস্থা পরিবর্তনগুলি KVO-র মাধ্যমে ট্র্যাক করা হয় — এটি প্রতিক্রিয়াশীল UI আপডেটের ভিত্তি। OperationQueue স্বয়ংক্রিয়ভাবে সম্পূর্ণ অপারেশনগুলি কিউ থেকে সরিয়ে দেয় এবং নির্ভরশীল অপারেশনগুলিকে জানিয়ে দেয় যে তাদের পূর্বশর্ত পূর্ণ হয়েছে, তাদের নির্বাহ শুরু করে।
Operation একটি অ্যাবস্ট্রাক্ট ক্লাস যার জন্য main() বা start() মেথড ওভাররাইড করা প্রয়োজন। টাস্ক কোড main() মেথডে রাখা হয়, এবং isExecuting এবং isFinished অবস্থাগুলি স্বয়ংক্রিয়ভাবে পরিচালিত হয়। অ্যাসিঙ্ক্রোনাস অপারেশনের জন্য, start() ওভাররাইড করা এবং ম্যানুয়ালি অবস্থা ফ্ল্যাগ পরিচালনা করা প্রয়োজন।
BlockOperation হল Operation-এর একটি কংক্রিট বাস্তবায়ন যা কোডের এক বা একাধিক ব্লক নির্বাহ করে। BlockOperation কনকারেন্ট হয়ে যায় যদি আপনি addExecutionBlock()-এর মাধ্যমে একাধিক ব্লক যোগ করেন। অপারেশন শুধুমাত্র সমস্ত যোগ করা ব্লক নির্বাহ শেষ হওয়ার পরে সম্পূর্ণ হয়। BlockOperation ইনহেরিটেন্স ছাড়াই সাধারণ কাজের জন্য একটি সুবিধাজনক বিকল্প।
| বৈশিষ্ট্য | Operation | BlockOperation |
|---|---|---|
| ক্লাস টাইপ | অ্যাবস্ট্রাক্ট | কংক্রিট |
| ইনহেরিটেন্স | প্রয়োজনীয় | প্রয়োজনীয় নয় |
| অ্যাসিঙ্ক্রোনিসিটি | ম্যানুয়াল KVO পরিচালনা | স্বয়ংক্রিয় |
| কোড ব্লক | main()-এ একটি | এক বা একাধিক |
| ব্যবহার | অবস্থা সহ জটিল কাজ | সাধারণ একবারের কাজ |
| উপযুক্ত | ডিপেন্ডেন্সি, বাতিলকরণ, অগ্রগতি | দ্রুত ব্লক, সমাপ্তি |
| মেমোরি | KVO এবং অবস্থার কারণে বেশি | সর্বনিম্ন, হালকা |
একটি কাস্টম অপারেশন তৈরি করতে, Operation থেকে সাবক্লাস তৈরি করুন এবং main() ওভাররাইড করুন। ভিতরে, ব্যয়বহুল অপারেশনের আগে isCancelled ফ্ল্যাগ চেক করুন যাতে দ্রুত বাতিলকরণ নিশ্চিত হয়। এটি বড় ফাইল ডাউনলোড বা ব্যাচ ডেটা প্রসেসিংয়ের জন্য গুরুত্বপূর্ণ। Operation এবং BlockOperation-এর মধ্যে নির্বাচন কাজের জটিলতার উপর নির্ভর করে: সাধারণ একবারের কর্মের জন্য BlockOperation যথেষ্ট; অবস্থা সহ পুনঃব্যবহারযোগ্য লজিকের জন্য, Operation থেকে সাবক্লাস তৈরি করুন।
ডিপেন্ডেন্সি হল DispatchQueue-এর উপর OperationQueue-এর মূল সুবিধা। মেথড addDependency(_:) নির্দিষ্ট করে যে অপারেশন B শুধুমাত্র অপারেশন A সম্পূর্ণ হওয়ার পরে নির্বাহ হয়। ডিপেন্ডেন্সিগুলি একটি নির্দেশিত অচক্রীয় গ্রাফ (DAG) গঠন করে: যদি একটি চক্রীয় ডিপেন্ডেন্সি যোগ করা হয়, কিউ এটি উপেক্ষা করে এবং অপারেশনগুলি শুরু হয় না।
প্রায়োরিটি একটি অপারেশনের queuePriority প্রপার্টির মাধ্যমে মান সহ সেট করা হয়: .veryLow, .low, .normal, .high, .veryHigh। প্রায়োরিটি প্রস্তুত অপারেশনগুলির মধ্যে শুরু হওয়ার ক্রমকে প্রভাবিত করে কিন্তু ডিপেন্ডেন্সি ওভাররাইড করে না। OperationQueue প্রথমে ডিপেন্ডেন্সি সমাধান করে, তারপর উপলব্ধ অপারেশনগুলির মধ্যে প্রায়োরিটি প্রয়োগ করে।
একটি সাধারণ দৃশ্যকল্প — প্রোফাইল ডেটা লোড করা: প্রথমে ব্যবহারকারী লোড করুন, তারপর তার id-এর ভিত্তিতে বন্ধু এবং পোস্ট লোড করুন। ব্যবহারকারী লোড করা এবং বন্ধু লোড করা-র মধ্যে একটি ডিপেন্ডেন্সি সেট করা নেস্টেড কমপ্লিশন হ্যান্ডেলার ছাড়াই সঠিক ক্রম নিশ্চিত করে।
maxConcurrentOperationCount প্রপার্টি একসাথে নির্বাহিত অপারেশনের সংখ্যা সীমিত করে। মান 1 একটি সিকোয়েন্সিয়াল কিউ তৈরি করে, ডিফল্ট মান (NSOperationQueueDefaultMaxConcurrentOperationCount) সিস্টেম-অপ্টিমাল, যা বর্তমান ডিভাইস লোডের উপর নির্ভর করে। এই প্যারামিটারের সঠিক কনফিগারেশন অত্যধিক রিসোর্স খরচ প্রতিরোধ করে: ইমেজ লোড করার জন্য, 4–6 কনকারেন্ট অপারেশন যথেষ্ট; CPU-নিবিড় কাজের জন্য, প্রসেসর কোরের সংখ্যা ব্যবহার করুন।
OperationQueue এবং DispatchQueue-এর মধ্যে নির্বাচন কাজের জটিলতার উপর নির্ভর করে। DispatchQueue সহজ async কলের জন্য একটি হালকা টুল। OperationQueue অনেক আন্তঃসম্পর্কিত কাজ সহ জটিল দৃশ্যকল্পের জন্য একটি ভারী সমাধান। Apple DispatchQueue দিয়ে শুরু করার এবং শুধুমাত্র যখন ডিপেন্ডেন্সি বা বাতিলকরণের প্রয়োজন হয় তখন OperationQueue-তে স্যুইচ করার পরামর্শ দেয়। বেশিরভাগ iOS প্রকল্পের জন্য, উভয় টুলের সংমিশ্রণ কর্মক্ষমতা এবং নমনীয়তার সর্বোত্তম ভারসাম্য প্রদান করে।
Ray Wenderlich (2025) অনুসারে, বড় iOS প্রকল্পে, OperationQueue অগ্রগতি এবং বাতিলকরণ সহ সামগ্রী লোড করার জন্য ব্যবহৃত হয়, যখন DispatchQueue অন্যান্য সমস্ত async অপারেশনের জন্য ব্যবহৃত হয়। অনুপাত প্রায় 20 থেকে 80 DispatchQueue-এর পক্ষে।
আসুন তিনটি উদাহরণ দেখি: একটি সাধারণ BlockOperation, ডিপেন্ডেন্সি সহ একটি কাস্টম Operation, এবং ডেটা লোড করার জন্য একটি বাতিলযোগ্য অপারেশন।
সবচেয়ে সহজ কেস — OperationQueue-তে একটি ব্লক নির্বাহ করুন এবং completionBlock-এর মাধ্যমে ফলাফল হ্যান্ডেল করুন। প্রতিটি Operation-এ একটি অন্তর্নির্মিত completionBlock প্রপার্টি আছে, যা main() শেষ হওয়ার পরে কল করা হয়।
let queue = OperationQueue()
let operation = BlockOperation()
operation.addExecutionBlock {
let data = NetworkService.fetchData()
OperationQueue.main.addOperation {
self.updateUI(data)
}
}
queue.addOperation(operation)
ডিপেন্ডেন্সি নিশ্চিত করে যে parseOperation শুধুমাত্র downloadOperation সম্পূর্ণ হওয়ার পরে শুরু হয়। এটি নেস্টেড কলব্যাকের প্রয়োজনীয়তা দূর করে।
let download = BlockOperation { self.downloadJSON() }
let parse = BlockOperation { self.parseJSON() }
parse.addDependency(download)
let queue = OperationQueue()
queue.addOperations([download, parse], waitUntilFinished: false)
পর্যায়ক্রমিক isCancelled চেক সহ main() ওভাররাইড করুন। এটি অপারেশনকে বাতিল হওয়ার সাথে সাথে থামতে দেয়, একটি ব্যয়বহুল অপারেশন শেষ হওয়ার জন্য অপেক্ষা না করে।
class ImageLoadOperation: Operation {
override func main() {
guard !self.isCancelled else { return }
let image = self.downloadImage()
guard !self.isCancelled else { return }
OperationQueue.main.addOperation { self.display(image) }
}
}
বাতিলকরণ একটি অপারেশনের isCancelled ফ্ল্যাগ true-তে সেট করে, কিন্তু ইতিমধ্যে চলমান main() মেথড বন্ধ করে না। main()-এর ভিতরের কোডকে নিজেই isCancelled চেক করতে হবে এবং প্রয়োজন হলে শেষ করতে হবে। এটি Apple-এর আর্কিটেকচারাল সিদ্ধান্ত — যা ডেভেলপারকে বাতিলকরণের সময় সঠিকভাবে রিসোর্স মুক্ত করতে দেয়।
KVO পর্যবেক্ষণ isFinished এবং isExecuting প্রপার্টির স্পষ্ট কলব্যাক ছাড়াই অপারেশন সম্পূর্ণ হওয়ার প্রতিক্রিয়া জানাতে দেয়। OperationQueue স্বয়ংক্রিয়ভাবে সম্পূর্ণ অপারেশনগুলি কিউ থেকে সরিয়ে দেয়, কিন্তু সেগুলি মেমোরিতে থাকে যতক্ষণ না তাদের উপর শক্তিশালী রেফারেন্স থাকে। KVO হল RxSwift বা Combine-এর মতো প্রতিক্রিয়াশীল ফ্রেমওয়ার্কের সাথে OperationQueue সংহত করার ভিত্তি।
KVO-র মাধ্যমে isCancelled-এ সাবস্ক্রাইব করা অপারেশন বাতিলের সময় UI আপডেট করার অনুমতি দেয় — উদাহরণস্বরূপ, বাতিল ডাউনলোডের পরিবর্তে একটি প্লেসহোল্ডার দেখানো। isCancelled প্রপার্টি KVO-সামঞ্জস্যপূর্ণ, যা এটিকে প্রতিক্রিয়াশীল পাইপলাইনের জন্য সুবিধাজনক করে তোলে।
বিপুল সংখ্যক অপারেশন তৈরি করবেন না — প্রতিটি Operation মেমোরিতে একটি পৃথক অবজেক্ট। যদি একটি কাজ ছোট হয় এবং ডিপেন্ডেন্সির প্রয়োজন না হয়, সরাসরি DispatchQueue ব্যবহার করুন। OperationQueue স্পষ্ট ডিপেন্ডেন্সি, বাতিলকরণ এবং অগ্রগতি পর্যবেক্ষণ সহ জটিল দৃশ্যকল্পের জন্য ন্যায়সঙ্গত।
ব্যয়বহুল অপারেশনের আগে isCancelled চেক করুন main() মেথডের ভিতরে। ফাইল ডাউনলোড বা ইমেজ প্রসেসিংয়ের ক্ষেত্রে, প্রতিটি গুরুত্বপূর্ণ ধাপের পরে চেক করা বাতিলকরণের জন্য দ্রুত প্রতিক্রিয়া নিশ্চিত করে। main()-এর শুরুতে এবং প্রতিটি বড় অপারেশনের পরে if isCancelled { return } ব্যবহার করুন।
completionBlock সঠিকভাবে পরিচালনা করুন। একটি অপারেশনের completionBlock প্রপার্টি main() শেষ হওয়ার পরে কল করা হয়, এমনকি যদি অপারেশনটি বাতিল করা হয়। ভুল ডেটা দিয়ে UI আপডেট এড়াতে completionBlock-এর ভিতরে isCancelled চেক করুন। OperationQueue.main UI অপারেশনের জন্য একটি থ্রেড-নিরাপদ কিউ, যা DispatchQueue.main-এর মতো।
চক্রীয় ডিপেন্ডেন্সি এড়িয়ে চলুন — এগুলি চক্রের কোনো অপারেশনকে কখনো শুরু হতে দেয় না। OperationQueue স্বয়ংক্রিয়ভাবে চক্র সনাক্ত করে না: যদি A, B-র উপর নির্ভর করে এবং B, A-র উপর নির্ভর করে, উভয় চিরকাল ready অবস্থায় থাকবে। আগে থেকে ডিপেন্ডেন্সি গ্রাফের পরিকল্পনা করুন।
সচরাচর জিজ্ঞাসিত প্রশ্ন
OperationQueue GCD-র উপরে নির্মিত এবং ডিপেন্ডেন্সি, প্রায়োরিটি, KVO এবং অপারেশন বাতিলকরণ যোগ করে। DispatchQueue এই ক্ষমতা ছাড়াই সাধারণ async কাজের জন্য একটি হালকা টুল।
maxConcurrentOperationCount প্রপার্টি 1-এ সেট করুন। এটি OperationQueue-কে সমস্ত সুবিধা — ডিপেন্ডেন্সি, প্রায়োরিটি এবং বাতিলকরণ — বজায় রেখে একটি সিকোয়েন্সিয়াল কিউতে রূপান্তরিত করে।
cancel() মেথড isCancelled ফ্ল্যাগ সেট করে কিন্তু নির্বাহ চলমান main() মেথড বন্ধ করে না। অপারেশন কোডকে নিজেই isCancelled চেক করতে হবে এবং শেষ করতে হবে। বাতিলকরণ শুধুমাত্র অপেক্ষমাণ এবং প্রস্তুত অপারেশনের জন্য কাজ করে।
আপনার অবস্থা পরিচালনা, অ্যাসিঙ্ক্রোনিসিটি বা লজিক পুনঃব্যবহারের প্রয়োজন হলে Operation থেকে সাবক্লাস তৈরি করা উচিত। BlockOperation ইনহেরিটেন্স ছাড়াই সাধারণ একবারের কাজের জন্য উপযুক্ত।
না, যদি না আপনি মূল থ্রেডে waitUntilFinished প্যারামিটার true সহ কল করেন। অপারেশন ডিফল্টরূপে ব্যাকগ্রাউন্ড থ্রেডে নির্বাহ হয়, এবং ফলাফল OperationQueue.main-এর মাধ্যমে ফিরে আসে।
সারাংশ
আমরা একটি মোবাইল অ্যাপ্লিকেশন টার্নকি তৈরি করব
IT Sectr 2017 সাল থেকে স্টার্টআপ এবং ব্যবসার জন্য iOS এবং Android অ্যাপ্লিকেশন তৈরি করে। আমরা আপনাকে পরামর্শ দেব এবং সেরা সমাধান প্রস্তাব করব।
আরও পড়ুন