რატომ არ არის რეკომენდებული მთავარი ნაკადის დატვირთვა iOS-ში და რა გზები არსებობს ამის თავიდან ასაცილებლად?
sobes.tech AI
პასუხი AI-სგან
মূল থ্রেডটি ব্যবহারকারীর ইন্টারফেস আপডেট এবং UI ইভেন্টের প্রক্রিয়াকরণের জন্য দায়ী। কোনও দীর্ঘস্থায়ী অপারেশন (নেটওয়ার্ক অনুরোধ, ভারী গণনা, ফাইলের সাথে কাজ) মূল থ্রেডে ব্লক করবে, যা "ফ্রিজড" UI, কম প্রতিক্রিয়াশীলতা এবং এমনকি এর ক্র্যাশ (watchdog timeout) এর কারণ হবে।
মূল থ্রেডের উপর লোড এড়ানোর উপায়:
-
Grand Central Dispatch (GCD): ব্যাকগ্রাউন্ড কিউতে অ্যাসিঙ্ক্রোনাস কাজ সম্পাদন করতে দেয়।
DispatchQueue.global(): বিভিন্ন অগ্রাধিকার সহ গ্লোবাল ব্যাকগ্রাউন্ড কিউগুলি পান।DispatchQueue.main: UI আপডেটের জন্য মূল কিউ।async { ... }: কোড ব্লক অ্যাসিঙ্ক্রোনাসভাবে সম্পাদন করুন।
// ভারী কাজ ব্যাকগ্রাউন্ড থ্রেডে সম্পাদন DispatchQueue.global(qos: .userInitiated).async { // ভারী গণনা বা নেটওয়ার্ক অনুরোধ // UI আপডেট মূল থ্রেডে DispatchQueue.main.async { // ব্যবহারকারীর ইন্টারফেস আপডেট করুন } } -
Operation Queues (Operation & OperationQueue): GCD কিউগুলির উপরে একটি উচ্চতর স্তরের বিমূর্ততা, যা অপারেশনের মধ্যে নির্ভরতা, বাতিলকরণ এবং বিরত রাখার সমর্থন করে।
OperationQueue(): অপারেশন কিউ তৈরি করুন।Operation: একটি বিমূর্ত ক্লাস যা কিউতে যোগ করা যায়।addOperation(_:): অপারেশন কিউতে যোগ করুন।
let downloadOperation = BlockOperation { // ডেটা ডাউনলোড করুন } let parseOperation = BlockOperation { // ডেটা বিশ্লেষণ করুন } // নির্ভরতা: ডাউনলোডের পরে বিশ্লেষণ শুরু হয় parseOperation.addDependency(downloadOperation) let queue = OperationQueue() queue.addOperation(downloadOperation) queue.addOperation(parseOperation) -
Concurrency (async/await): Swift-এ আধুনিক পদ্ধতি অ্যাসিঙ্ক্রোনাস প্রোগ্রামিংয়ের জন্য।
async: একটি ফাংশনকে অ্যাসিঙ্ক্রোনাস হিসেবে চিহ্নিত করে।await: একটি অ্যাসিঙ্ক্রোনাস অপারেশনের সমাপ্তির জন্য অপেক্ষা করে।Task: একটি নতুন প্রতিযোগিতামূলক কাজ তৈরি করে।
func fetchData() async throws -> Data { let url = URL(string: "https://example.com/data")! let (data, _) = try await URLSession.shared.data(from: url) return data } func updateUI() { Task { do { let data = try await fetchData() // ডেটা প্রক্রিয়াকরণ // UI স্বয়ংক্রিয়ভাবে মূল থ্রেডে আপডেট হয় // (যদি Task মূল Actor বা DispatchQueue.main-এ তৈরি হয়) } catch { // ত্রুটি পরিচালনা করুন } } } -
Actors: বিভিন্ন প্রতিযোগিতামূলক প্রসঙ্গ থেকে অ্যাক্সেসের সময় ডেটা দৌড়ের প্রতিরোধ করে, তাদের অবস্থা একচেটিয়া অ্যাক্সেস নিশ্চিত করে।
actor DataStore { private var data: [String] = [] func addData(_ item: String) { data.append(item) } func getData() -> [String] { return data } } let store = DataStore() Task { await store.addData("item1") }
GCD, Operation Queues এবং Concurrency এর মধ্যে পছন্দটি কাজের জটিলতা, প্রয়োজনীয় নিয়ন্ত্রণ স্তর এবং কোডের কাঠামোর প্রয়োজনীয়তার উপর নির্ভর করে। Concurrency আধুনিক অ্যাপ্লিকেশনে পঠনযোগ্যতা এবং নিরাপত্তার জন্য পছন্দের পদ্ধতি।