একটি রানলুপ হল একটি লুপ যা একটি নির্দিষ্ট থ্রেডে ইনকামিং ইভেন্টগুলির প্রাপ্তি এবং প্রক্রিয়াকরণের সমন্বয় করে।
RunLoop প্রতিটি থ্রেডে উপস্থিত থাকে, কিন্তু ডিফল্টরূপে, এটি স্ট্যান্ডবাই মোডে থাকে এবং কোনো কাজ করে না।
ডেভেলপার প্রয়োজনে এটি চালাতে পারে, তবে এটি স্বয়ংক্রিয়ভাবে কাজ করবে না। এটি করার জন্য, আপনাকে কোড লিখতে হবে।
প্রথমত, RunLoop ডিজাইন করা হয়েছে ইনকামিং টাস্কের প্রবাহ পরিচালনা করার জন্য এবং সঠিক সময়ে সেগুলি চালানোর জন্য।
UI এর সাথে কাজ করার সময় এটি সবচেয়ে বেশি লক্ষণীয়, উদাহরণস্বরূপ, UIScrollView ব্যবহার করার সময়।
ডিফল্টরূপে, প্রধান RunLoop সর্বদা অ্যাপ্লিকেশনে চলছে; এটি সিস্টেম থেকে বার্তাগুলি প্রক্রিয়া করে এবং সেগুলিকে অ্যাপ্লিকেশনে প্রেরণ করে। এই ধরনের বার্তাগুলির একটি উদাহরণ হতে পারে, উদাহরণস্বরূপ, একটি ইভেন্ট যখন একজন ব্যবহারকারী স্ক্রিনে ক্লিক করে।
সহায়ক থ্রেডগুলির জন্য একটি রানলুপের প্রয়োজনীয়তার স্ব-সংকল্প প্রয়োজন। আপনার যদি এটির প্রয়োজন হয় তবে আপনাকে এটি নিজেই কনফিগার করতে হবে এবং চালাতে হবে। ডিফল্টরূপে RunLoop চালানো বাঞ্ছনীয় নয়, এটি শুধুমাত্র সেই ক্ষেত্রে প্রয়োজন যেখানে আমাদের থ্রেডগুলির সাথে সক্রিয় মিথস্ক্রিয়া প্রয়োজন।
এছাড়াও, অ্যাপ্লিকেশনের সমস্ত টাইমার রানলুপে কার্যকর করা হয়, তাই আপনার যদি আপনার অ্যাপ্লিকেশনে তাদের সাথে যোগাযোগ করার প্রয়োজন হয় তবে আপনাকে অবশ্যই রানলুপের বৈশিষ্ট্যগুলি অধ্যয়ন করতে হবে।
RunLoop হল একটি লুপ, এবং এটির অপারেশনের বেশ কয়েকটি মোড রয়েছে যা বিকাশকারীকে কখন একটি নির্দিষ্ট কাজ চালাতে হবে তা বুঝতে সাহায্য করে।
সুতরাং, RunLoop নিম্নলিখিত মোডে হতে পারে:
Default
- ডিফল্ট মোড, স্ট্রীম বিনামূল্যে, এবং বড় অপারেশন নিরাপদে সঞ্চালিত করা যেতে পারে.
Tracking
- থ্রেড কিছু গুরুত্বপূর্ণ কাজে ব্যস্ত। এই মুহুর্তে, কোনও কাজ না চালানোই ভাল, বা অন্তত কিছু ছোট কাজ চালানো।
Initialization
- এই মোডটি স্ট্রীম শুরু করার সময় একবার কার্যকর করা হয়।
EventReceive
- এটি সিস্টেম ইভেন্টগুলি গ্রহণের জন্য একটি অভ্যন্তরীণ মোড, যা সাধারণত ব্যবহার করা হয় না।
Common
- একটি স্থানধারক মোড যার কোনো ব্যবহারিক তাৎপর্য নেই।
প্রধান রানলুপে, এই মোডগুলি স্বয়ংক্রিয়ভাবে সুইচ করা হয়; ডেভেলপার এগুলিকে সময়সাপেক্ষ কাজ সম্পাদন করতে ব্যবহার করতে পারে যাতে ব্যবহারকারী ইন্টারফেস ঝুলে থাকা লক্ষ্য না করে। এর একটি উদাহরণ তাকান.
অন্যান্য রানলুপে এক্সিকিউশন সাইকেল ম্যানেজমেন্ট সম্পূর্ণ স্বয়ংক্রিয় নয়। আপনাকে একটি থ্রেডের জন্য কোড লিখতে হবে যা একটি উপযুক্ত সময়ে কার্যকরী চক্র শুরু করবে। এছাড়াও, আপনাকে ইভেন্টগুলিতে যথাযথভাবে প্রতিক্রিয়া জানাতে হবে এবং মৃত্যুদন্ডের চক্র বন্ধ না হয় তা নিশ্চিত করতে অবিরাম লুপ ব্যবহার করতে হবে।
আমাদের একটি UIScrollView আছে, এবং আমাদের মূল থ্রেডে একটি বড় কাজ করতে হবে যাতে ব্যবহারকারী কিছু লক্ষ্য না করে।
আমরা স্বাভাবিক উপায়ে কাজটি সম্পূর্ণ করতে পারি:
DispatchQueue.main.async { sleep(2) self.tableView.refreshControl?.endRefreshing() }
কিন্তু ফলাফল বেশ খারাপ হতে চলেছে। ব্যবহারকারী অ্যাপ্লিকেশনে উল্লেখযোগ্য বিলম্ব লক্ষ্য করবেন।
এই নেতিবাচক প্রভাবটি ঘটে এই কারণে যে আমরা এই মুহুর্তে কী ঘটছে সেদিকে কোনও মনোযোগ না দিয়ে মূল থ্রেডে একটি টাস্ক চালাই।
এই কারণে, যখন ব্যবহারকারী ইন্টারফেসের সাথে যোগাযোগ করে তখন আমরা আমাদের বড় কাজটি সম্পাদন করতে শুরু করি। এটি, অবশ্যই, ব্যবহারকারী ইন্টারফেস ঝুলন্ত দেখতে যে সত্য বাড়ে.
RunLoop পদ্ধতি ব্যবহার করে এটি এড়ানো যেতে পারে। আসুন এটি ব্যবহার করে একই যুক্তি প্রয়োগ করি:
CFRunLoopPerformBlock(CFRunLoopGetMain(), CFRunLoopMode.defaultMode.rawValue) { sleep(2) self.tableView.refreshControl?.endRefreshing() }
আমাকে এখানে কি ঘটবে ব্যাখ্যা করা যাক. CFRunLoopPerformBlock ফাংশন RunLoop এর মাধ্যমে সম্পাদনের জন্য কোড যোগ করে। কোড ব্লক নিজেই ছাড়াও, এই ফাংশন 2 গুরুত্বপূর্ণ পরামিতি আছে.
কোন RunLoop ফাংশন কার্যকর করা উচিত তা নির্বাচন করার জন্য প্রথমটি দায়ী। এই উদাহরণে, "প্রধান" ব্যবহার করা হয়।
দ্বিতীয়টি যে মোডে কাজটি সম্পন্ন হবে তার জন্য দায়ী।
মোট তিনটি সম্ভাব্য মোড আছে:
সাধারণ - ডিফল্ট মোড এবং ট্র্যাকিং মোড একত্রিত করে।
উপরের কোড দিয়ে প্রোগ্রাম চালানোর ফলাফল হবে:
ব্যবহারকারী যখন ইউজার ইন্টারফেস (UI) এর সাথে ইন্টারঅ্যাক্ট করা শুরু করে, তখন প্রধান রান লুপ "ট্র্যাকিং" মোডে চলে যায় এবং ইন্টারফেসের মসৃণতা নিশ্চিত করার জন্য অস্থায়ীভাবে অন্যান্য সমস্ত ইভেন্টের প্রক্রিয়াকরণ স্থগিত করে। একবার ব্যবহারকারী ইন্টারফেসের সাথে ইন্টারফেস করা বন্ধ করে দিলে, রান লুপ তার "ডিফল্ট" মোডে ফিরে আসে এবং আমাদের কাজটি আবার শুরু করে।
ব্যবহারকারী ইন্টারফেস ছাড়াও, লুপটি টাইমারগুলির কার্যকারিতার সাথে ঘনিষ্ঠভাবে যুক্ত।
অ্যাপ্লিকেশনের যেকোনো টাইমার একটি লুপে চলে, এবং তাদের সাথে কাজ করার সময় ভুল না করার জন্য আপনাকে অতিরিক্ত সতর্কতা অবলম্বন করতে হবে, বিশেষ করে যদি তারা অর্থপ্রদান প্রক্রিয়াকরণের মতো গুরুত্বপূর্ণ কার্যকারিতার জন্য দায়ী হয়।
Timer.scheduledTimer(withTimeInterval: 1, repeats: false) { _ in // makeSomething }
টাইমারটি ডিফল্টরূপে ডিফল্ট মোডে শুরু হয়, তাই ব্যবহারকারী এই মুহূর্তে টেবিলের মধ্য দিয়ে স্ক্রোল করলে এটি কাজ করা বন্ধ করতে পারে। কারণ লুপটি বর্তমানে ট্র্যাকিং মোডে রয়েছে৷ এই কারণে উদাহরণের কোডটি সঠিকভাবে কাজ নাও করতে পারে। আপনি সাধারণ মোডে একটি টাইমার যোগ করে এই সমস্যাটি সমাধান করতে পারেন।
let timer = Timer.scheduledTimer(withTimeInterval: 1, repeats: false) { _ in // makeSomething } RunLoop.main.add(timer, forMode: .common)
এছাড়াও, টাইমারগুলি প্রত্যাশিত সময়ে ফায়ার করতে পারে না বা একেবারেই নাও হতে পারে। এর কারণ হল RunLoop শুধুমাত্র প্রতিটি চক্রের শুরুতে টাইমার চেক করে। রানলুপ এই পর্যায়টি অতিক্রম করার পরে যদি একটি টাইমার ট্রিগার করে, আমরা পরবর্তী পুনরাবৃত্তির শুরু পর্যন্ত এটি সম্পর্কে জানতে পারব না। একই সময়ে, রানলুপে টাস্কটি যত দীর্ঘ হবে, তত বেশি বিলম্ব হবে।
এই সমস্যাটি সমাধান করতে, আপনি একটি নতুন থ্রেড তৈরি করতে পারেন, সেই থ্রেডে একটি রানলুপ শুরু করতে পারেন এবং তারপরে অন্য কোনো কাজ না যোগ করে থ্রেডে একটি টাইমার যোগ করতে পারেন - এইভাবে, টাইমারটি সঠিকভাবে কাজ করবে।
let thread = Thread { let timer = Timer(timeInterval: 1.0, repeats: true) { timer in // makeSomething } RunLoop.current.add(timer, forMode: .default) RunLoop.current.run() } thread.start()
এই নিবন্ধে, আমরা রানলুপ কী এবং এটি iOS অ্যাপ্লিকেশনগুলিতে কী সমস্যার সমাধান করে তা দেখেছি। একটি রানলুপ হল একটি লুপ যা একটি নির্দিষ্ট থ্রেডের মধ্যে ইনকামিং ইভেন্টগুলির অভ্যর্থনা এবং প্রক্রিয়াকরণের সমন্বয় করে এবং এটির অপারেশনের বিভিন্ন মোড রয়েছে।
ইউজার ইন্টারফেস (UI) এবং টাইমারগুলির সাথে কাজ করার সময় এটি বিশেষভাবে কার্যকর কারণ এতে সঠিক সময়ে কাজগুলি চালানোর ক্ষমতা রয়েছে, যা আপনাকে ইন্টারফেসটিকে "হ্যাং আপ" এড়াতে এবং টাইমারগুলির সঠিক অপারেশন নিশ্চিত করতে দেয়৷
রান লুপের সাথে কাজ করার জন্য অতিরিক্ত কোডিং প্রয়োজন হওয়া সত্ত্বেও, এটি একটি সার্থক বিনিয়োগ যা আপনার অ্যাপ্লিকেশনের দক্ষতা এবং স্থিতিশীলতা উন্নত করে।