Block হল একটি Objective-C তে ব্যবহৃত একটি শক্তিশালী কনসেপ্ট, যা একটি অ্যানোনিমাস (anonymous) ফাংশন বা কন্ট্রোল ফ্লো তৈরি করতে ব্যবহৃত হয়। ব্লকগুলি কোডের একটি ছোট অংশ যা একবার ডিফাইন করে বিভিন্ন জায়গায় ব্যবহার করা যায়, এবং এর ভিতরে থাকা ভেরিয়েবলগুলি স্কোপের বাইরে থেকেও অ্যাক্সেস করা যায়। ব্লকগুলি ক্লোজার (closures) বা ফাংশন পয়েন্টারের মতো কাজ করে এবং কোডকে আরও পরিষ্কার ও পুনঃব্যবহারযোগ্য করে তোলে।
Objective-C তে ব্লকগুলি মেমরি ম্যানেজমেন্টের জন্য ARC (Automatic Reference Counting) সিস্টেম ব্যবহার করে, এবং এগুলি সাধারণত asynchronous কাজ, callbacks, completion handlers ইত্যাদিতে ব্যবহৃত হয়।
1. Block এর মৌলিক গঠন
একটি ব্লক সাধারণত একটি কোডের অংশ হয় যা একটি ভেরিয়েবল বা আর্গুমেন্ট গ্রহণ করতে পারে এবং কিছু কাজ সম্পাদন করে। ব্লক গঠন সাধারণত নিম্নরূপ:
returnType (^blockName)(parameterType1, parameterType2, ...) = ^returnType (parameterType1 param1, parameterType2 param2, ...) {
// কোড
return result;
};- returnType: ব্লকটি যেটি রিটার্ন করবে, যেমন
void,NSString *,int, ইত্যাদি। - blockName: ব্লকের নাম, যা এটিকে ডিফাইন এবং কল করতে সাহায্য করে।
- parameterType1, parameterType2: ব্লকটি যেগুলি ইনপুট প্যারামিটার গ্রহণ করবে।
- block body: কোড যা ব্লকটি সম্পাদন করবে।
উদাহরণ:
// ব্লক ডেফিনিশন
int (^addNumbers)(int, int) = ^int(int a, int b) {
return a + b;
};
// ব্লক কল করা
int result = addNumbers(5, 3); // result হবে 8
NSLog(@"Result: %d", result); // আউটপুট: Result: 8এখানে addNumbers একটি ব্লক যা দুটি ইনপুট নেয় (int), এবং তাদের যোগফল রিটার্ন করে।
2. Block এর ব্যবহার
Objective-C তে ব্লকগুলি বিভিন্ন ক্ষেত্রে ব্যবহৃত হয়, যেমন:
- Completion Handlers: যখন কোনো অ্যাসিঙ্ক্রোনাস কাজ সম্পন্ন হওয়ার পর ফলাফল প্রক্রিয়া করতে হয়।
- Callbacks: কোনো এক্সটার্নাল সিস্টেম বা API থেকে সাড়া পাওয়ার জন্য ব্লক ব্যবহৃত হয়।
- Asynchronous Tasks: টাইম-লিংকড বা ব্যাকগ্রাউন্ড কার্যক্রমের জন্য ব্লক ব্যবহৃত হয়।
- Collection Manipulation: অ্যারে বা ডিকশনারি আইটেমের উপর কোনো কাজ করতে ব্লক ব্যবহার করা যায়।
3. Block এর ব্যবহার উদাহরণ
৩.১ Completion Handler ব্যবহার
একটি সাধারণ completion handler হল একটি ব্লক যা কোনো অ্যাসিঙ্ক্রোনাস কাজ শেষ হওয়ার পর কল করা হয়।
- (void) fetchDataWithCompletion:(void (^)(NSString *result, NSError *error))completionHandler {
// দীর্ঘ সময়ের কাজ
NSString *data = @"Fetched Data";
NSError *error = nil;
// কাজ শেষ হলে completion handler কল করা
completionHandler(data, error);
}
- (void) testFetchData {
[self fetchDataWithCompletion:^(NSString *result, NSError *error) {
if (error) {
NSLog(@"Error: %@", error);
} else {
NSLog(@"Data: %@", result); // আউটপুট: Data: Fetched Data
}
}];
}এখানে, fetchDataWithCompletion মেথডটি একটি block গ্রহণ করে, যা completionHandler নামে পরিচিত। কাজ শেষ হলে ব্লকটি কল করা হয় এবং result আউটপুট হিসাবে দেয়া হয়।
৩.২ Asynchronous Tasks
ব্লকগুলো অ্যাসিঙ্ক্রোনাস কার্যক্রম যেমন টাইমআউট, ওয়েব রিকোয়েস্ট ইত্যাদিতে ব্যবহৃত হয়।
- (void) performAsyncTask {
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
// ব্যাকগ্রাউন্ড থ্রেডে কাজ
NSLog(@"Background Task Started");
// কাজ শেষ হলে মেইন থ্রেডে ফলাফল আনা
dispatch_async(dispatch_get_main_queue(), ^{
NSLog(@"Background Task Completed");
});
});
}এখানে dispatch_async একটি asynchronous block চালায়, যা ব্যাকগ্রাউন্ড থ্রেডে কাজ করে এবং তারপর মেইন থ্রেডে ফলাফল দেখায়।
4. Block এবং Memory Management
Objective-C তে ব্লকগুলি স্বাভাবিকভাবে মেমরি ম্যানেজমেন্টের জন্য ARC ব্যবহার করে। তবে, যখন ব্লকগুলি অবজেক্টে অ্যাসাইন করা হয় বা self রেফারেন্স থাকে, তখন এটি retain cycle তৈরি করতে পারে। এই সমস্যাটি এড়াতে __weak বা __strong রেফারেন্স ব্যবহৃত হয়।
৪.১ Block এবং Retain Cycle
__weak typeof(self) weakSelf = self;
self.someBlock = ^{
[weakSelf doSomething]; // ব্লক ভেতর self কে ব্যবহার করার জন্য __weak ব্যবহৃত
};এখানে, __weak ব্যবহৃত হয়েছে যাতে ব্লকটি self এর রেফারেন্স কাউন্ট বাড়াতে না পারে, যা retain cycle এড়িয়ে চলে।
5. Block-এর সুবিধা ও সীমাবদ্ধতা
সুবিধা:
- অ্যাসিঙ্ক্রোনাস কার্যক্রমে ব্যবহার: ব্লকগুলি অ্যাসিঙ্ক্রোনাস কার্যক্রমে খুবই কার্যকরী, যেমন API কল বা টাইমার।
- কোড পুনঃব্যবহার: ব্লকগুলি কোডের পুনঃব্যবহারযোগ্যতা বাড়ায়। আপনি একবার একটি ব্লক তৈরি করে বিভিন্ন জায়গায় ব্যবহার করতে পারেন।
- ব্যাকগ্রাউন্ড কার্যক্রম: ব্লক দিয়ে ব্যাকগ্রাউন্ড কার্যক্রমের জন্য নতুন ফিচার তৈরি করা সহজ হয়।
সীমাবদ্ধতা:
- retain cycles: ব্লকগুলি self বা অন্য কোনো অবজেক্টের সাথে সঠিকভাবে মেমরি ম্যানেজমেন্ট না করলে retain cycles তৈরি হতে পারে।
- ব্লক সম্বন্ধীয় মেমরি কনফিগারেশন: কিছু জটিল অ্যাসাইনমেন্টে ব্লকের মেমরি ম্যানেজমেন্ট সঠিকভাবে কাজ নাও করতে পারে।
- গুরুত্বপূর্ণ পারফরম্যান্স ইস্যু: কিছু ক্ষেত্রে ব্লকগুলির ব্যবহার পারফরম্যান্স কমিয়ে দিতে পারে, বিশেষত অতিরিক্ত স্ট্যাক মেমরি ব্যবহার করলে।
সারাংশ
- Block হল একধরনের অ্যানোনিমাস ফাংশন যা কোডের কার্যকলাপ সংরক্ষণ এবং একাধিক জায়গায় পুনঃব্যবহারযোগ্য করে তোলে।
- ব্লকগুলি অ্যাসিঙ্ক্রোনাস কাজ, completion handlers, callbacks, এবং অন্যান্য কার্যক্রমে ব্যবহৃত হয়।
- ব্লকগুলি Objective-C তে শক্তিশালী কন্ট্রোল ফ্লো এবং কোডের কার্যক্ষমতা বৃদ্ধি করতে ব্যবহৃত হয়।
Read more