Objective-C তে Asynchronous Tasks এবং Queues হল অ্যাসিনক্রোনাস অপারেশন এবং মাল্টিথ্রেডিংয়ের গুরুত্বপূর্ণ অংশ। এগুলি বিশেষভাবে ব্যবহার করা হয় যখন আপনি দীর্ঘ-running কাজ করতে চান, যেমন নেটওয়ার্ক কল, ফাইল অপারেশন, বা বড় ডেটা প্রসেসিং, যাতে অ্যাপ্লিকেশন ইউজার ইন্টারফেস (UI) ব্লক না হয়। Asynchronous tasks এবং Queues আপনাকে পটভূমিতে কাজ করতে দেয়, এবং এগুলির মাধ্যমে প্রোগ্রামের পারফরম্যান্স এবং সাড়া দেওয়ার ক্ষমতা উন্নত হয়।
1. Asynchronous Tasks (অ্যাসিনক্রোনাস টাস্ক)
Asynchronous tasks হল এমন কাজ যা কম্পিউটার বা সিস্টেমের প্রসেসর বা থ্রেডের কাজ শেষ হওয়ার জন্য অপেক্ষা না করে, অন্য কাজ করার জন্য ছেড়ে দেয়। এটি বিশেষভাবে নেটওয়ার্ক রিকোয়েস্ট, ফাইল রিডিং বা ডাটাবেসের কাজের জন্য ব্যবহৃত হয়। অ্যাসিনক্রোনাস টাস্কের সুবিধা হল, আপনার ইউজার ইন্টারফেস হ্যাং (অবরুদ্ধ) না হয়ে সঠিকভাবে কাজ করে।
Objective-C তে অ্যাসিনক্রোনাস টাস্কের জন্য Grand Central Dispatch (GCD) এবং NSOperationQueue ব্যবহৃত হয়।
GCD (Grand Central Dispatch):
GCD হল একটি API যা থ্রেড ওয়ার্ক শিডিউলিং এবং অ্যাসিনক্রোনাস কোড এক্সিকিউশন সরবরাহ করে। GCD কে ব্যাকগ্রাউন্ড থ্রেডে কাজ পাঠানোর জন্য ব্যবহার করা হয়, যাতে মূল থ্রেড (UI) অবরুদ্ধ না হয়।
GCD সিনট্যাক্স:
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
// কাজ যা ব্যাকগ্রাউন্ডে সম্পন্ন হবে
NSLog(@"Background task started");
// কিছু লম্বা-running কাজ
dispatch_async(dispatch_get_main_queue(), ^{
// UI আপডেট
NSLog(@"Back to main queue to update UI");
});
});এখানে, প্রথমে একটি অ্যাসিনক্রোনাস কাজ dispatch_async এর মাধ্যমে dispatch_get_global_queue তে পাঠানো হয়েছে। এর পরে, কাজটি শেষ হলে dispatch_async দিয়ে মূল থ্রেডে ফিরে এসে UI আপডেট করা হচ্ছে।
2. Queues (কিউ)
Queues হল এমন একটি ডেটা স্ট্রাকচার যা কাজের (tasks) সিরিয়াল বা প্যারালাল এক্সিকিউশন পরিচালনা করে। Objective-C তে কিউ দুটি প্রধান ধরণের হয়: Serial Queue এবং Concurrent Queue।
- Serial Queue (সিরিয়াল কিউ): এই কিউতে কাজগুলো একটি একটার পর একটি সিরিয়াল ভাবে (তিনের অপেক্ষায়) এক্সিকিউট হয়। অর্থাৎ, এক কাজ শেষ হওয়ার পরেই পরবর্তী কাজ শুরু হয়।
- Concurrent Queue (কনকারেন্ট কিউ): এই কিউতে কাজগুলি একসাথে বা কনকারেন্টলি এক্সিকিউট হয়। একাধিক কাজ একসাথে রান করতে পারে।
GCD Queues এর ব্যবহার:
Serial Queue Example:
dispatch_queue_t serialQueue = dispatch_queue_create("com.myapp.serialQueue", NULL);
dispatch_async(serialQueue, ^{
NSLog(@"Task 1 started");
// কিছু লম্বা-running কাজ
});
dispatch_async(serialQueue, ^{
NSLog(@"Task 2 started");
// কিছু লম্বা-running কাজ
});এখানে, serialQueue সিরিয়াল কিউ এবং একে একে কাজগুলো এক্সিকিউট হবে। প্রথম কাজ শেষ হলে পরবর্তী কাজ শুরু হবে।
Concurrent Queue Example:
dispatch_queue_t concurrentQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_async(concurrentQueue, ^{
NSLog(@"Task 1 started");
// কিছু লম্বা-running কাজ
});
dispatch_async(concurrentQueue, ^{
NSLog(@"Task 2 started");
// কিছু লম্বা-running কাজ
});এখানে, concurrentQueue কনকারেন্ট কিউ এবং একাধিক কাজ একসাথে এক্সিকিউট হবে। প্রথম কাজ চলমান থাকা অবস্থায় পরবর্তী কাজও শুরু হতে পারে।
3. NSOperationQueue
NSOperationQueue হল একটি আরও উচ্চস্তরের কিউ ব্যবস্থাপনা ক্লাস যা আপনাকে NSOperation অবজেক্ট ব্যবহার করে অ্যাসিনক্রোনাস কাজ পরিচালনা করতে দেয়। এটি GCD এর তুলনায় কিছুটা বেশি কাস্টমাইজযোগ্য এবং শক্তিশালী, কারণ এটি কাজের পর্যালোচনা এবং প্রগ্রেস ম্যানেজমেন্টের সুবিধা দেয়।
NSOperationQueue Example:
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
NSOperation *operation1 = [NSBlockOperation blockOperationWithBlock:^{
NSLog(@"Task 1 started");
// কিছু লম্বা-running কাজ
}];
NSOperation *operation2 = [NSBlockOperation blockOperationWithBlock:^{
NSLog(@"Task 2 started");
// কিছু লম্বা-running কাজ
}];
[queue addOperation:operation1];
[queue addOperation:operation2];এখানে, দুটি NSBlockOperation তৈরি করা হয়েছে, এবং সেগুলিকে NSOperationQueue তে যোগ করা হয়েছে। কাজগুলো তখন কিউয়ে সিরিয়াল বা কনকারেন্টভাবে এক্সিকিউট হবে।
4. Asynchronous Tasks এবং Queues এর মধ্যে সম্পর্ক
- Asynchronous Tasks: এগুলি কোডের এক্সিকিউশন সময়ের জন্য ইউজার ইন্টারফেস (UI) ব্লক না হওয়ার জন্য ব্যবহৃত হয়। অ্যাসিনক্রোনাস কাজগুলি বিভিন্ন থ্রেডে এক্সিকিউট হতে পারে এবং কখনো কখনো Queue তে অ্যাসাইন করা হয়।
- Queues: কিউয়ের মাধ্যমে কাজগুলি সিরিয়ালি বা কনকারেন্টলি শিডিউল এবং এক্সিকিউট করা যায়। GCD এবং NSOperationQueue কিউ ব্যবস্থাপনা করতে ব্যবহৃত হয়, যেখানে কাজগুলো অ্যাসিনক্রোনাসভাবে রান করা হয়।
5. Memory Management with Asynchronous Tasks and Queues
- ARC (Automatic Reference Counting): অ্যাসিনক্রোনাস কাজ বা কিউ ব্যবহার করার সময়, নিশ্চিত করতে হবে যে কিউ বা ব্লকগুলো মেমরি লিক তৈরি না করে। কিউতে যে কাজটি পাঠানো হয়, তার জন্য মেমরি ম্যানেজমেন্ট প্রয়োজন, বিশেষত যখন ব্লকগুলিকে ক্যাপচার করা হয়।
- Weak References: কিউ বা ব্লকগুলিতে অবজেক্টের রেফারেন্স ব্যবহৃত হলে,
weakরেফারেন্স ব্যবহার করা হয় যাতে রেফারেন্স কাউন্ট বৃদ্ধি না হয় এবং অবজেক্টের রেফারেন্স লিক না হয়।
Weak References in Blocks:
__weak typeof(self) weakSelf = self;
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
[weakSelf someMethod]; // Use weak reference to avoid retain cycle
});এখানে weakSelf ব্যবহার করা হয়েছে যাতে retain cycle এড়ানো যায়।
6. সারাংশ
- Asynchronous Tasks হল এমন কাজ যা ব্যাকগ্রাউন্ডে রান করতে পারে এবং মূল থ্রেড ব্লক না করে।
- Queues বিভিন্ন কাজের জন্য ব্যবহৃত কিউ সিস্টেমের মাধ্যমে কাজগুলির সঠিক ব্যবস্থাপনা করতে সহায়তা করে। GCD এবং NSOperationQueue কিউ ব্যবস্থাপনা করতে ব্যবহৃত হয়।
- Memory Management: অ্যাসিনক্রোনাস কাজ বা কিউ ব্যবহারের সময় মেমরি লিক এড়াতে weak references এবং ARC ব্যবহৃত হয়।
Read more