البرمجة غير المتزامنة في Swift: دليل شامل عملي

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

البرمجة غير المتزامنة في Swift: دليل شامل عملي



البرمجة غير المتزامنة هي أحد المفاهيم الأساسية في التطوير الحديث لنظامي iOS و macOS. في Swift، بدءًا من الإصدار 5.5، ظهر نظام قوي يُسمى Structured Concurrency، مما جعل العمل مع التزامن غير المتزامن بسيطًا وآمنًا. في هذه المقالة، سنشرح الأدوات الرئيسية: async/await و Task و Actor و Sendable، وسنعرض تطبيقاتها بأمثلة عملية.



1. أساسيات async/await: كيف تتوقف عن كتابة الإغلاقات وتبدأ في العيش



قبل ظهور async/await، كان الكود غير المتزامن في Swift يُكتب باستخدام الإغلاقات والمفوّضين، مما أدى غالبًا إلى "جحيم الاستدعاءات الراجعة". النهج الحديث يسمح بكتابة كود غير متزامن بنفس الطريقة الخطية للكود المتزامن.



يمكن تعريف دالة غير متزامنة باستخدام الكلمة المفتاحية async. يتطلب استدعاء هذه الدالة سياقًا يدعم التزامن غير المتزامن والكلمة المفتاحية await.



// مثال على دالة غير متزامنة لتحميل البياناتfunc fetchUserData(userID: String) async throws -> User {    let url = URL(string: "https://api.example.com/users/\\(userID)")!    let (data, response) = try await URLSession.shared.data(from: url)        guard let httpResponse = response as? HTTPURLResponse,          httpResponse.statusCode == 200 else {        throw URLError(.badServerResponse)    }        let user = try JSONDecoder().decode(User.self, from: data)    return user}

// الاستخدامTask { do { let user = try await fetchUserData(userID: "123") print("User name: \\(user.name)") } catch { print("Error: \\(error)") }}


الميزات الرئيسية:

  • async — علامة للدالة غير المتزامنة
  • await — نقطة توقف مؤقت للتنفيذ
  • يمكن أن تكون الدالة async و throws في نفس الوقت
  • الخيط لا يُحجب — أثناء الانتظار، يمكنه تنفيذ عمل آخر


2. Task و TaskGroup: إدارة المهام المتوازية



Task هي الوحدة الأساسية للعمل غير المتزامن. تنشئ مهمة غير متزامنة جديدة تُنفذ في مجموعة الخيوط العامة. TaskGroup تسمح بتشغيل عدة مهام بالتوازي وجمع نتائجها.



إنشاء وإلغاء Task



// إنشاء مهمةlet task = Task {    let result = await performLongOperation()    return result}

// الحصول على النتيجةlet value = await task.value

// إلغاء المهمةtask.cancel()

// التحقق من الإلغاء داخل المهمةfunc performLongOperation() async -> String { // نتحقق مما إذا كانت المهمة قد ألغيت guard !Task.isCancelled else { return "Cancelled" } // محاكاة عمل طويل try? await Task.sleep(nanoseconds: 2_000_000_000) return "Completed"}


المعالجة المتوازية مع TaskGroup



// تحميل عدة صور بالتوازيfunc loadImages(urls: [URL]) async throws -> [UIImage] {    return try await withThrowingTaskGroup(of: UIImage.self) { group in        var images: [UIImage] = []        images.reserveCapacity(urls.count)                for url in urls {            group.addTask {                let (data, _) = try await URLSession.shared.data(from: url)                guard let image = UIImage(data: data) else {                    throw URLError(.cannotDecodeContentData)                }                return image            }        }                // جمع النتائج فور جاهزيتها        for try await image in group {            images.append(image)        }                return images    }}


هام: TaskGroup تدير تلقائيًا دورة حياة المهام الفرعية

المدونات

توصيات الكتب