قوائم المهام في Swift: GCD وOperationQueue وCombine لنظامي iOS/macOS

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

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

ابدأ الدورة

قوائم المهام لـ Swift (iOS/macOS): دليل شامل



في التطوير لنظامي iOS وmacOS، تعد الإدارة الفعالة للخيوط وقوائم المهام مفتاحًا لإنشاء تطبيقات سريعة الاستجابة وعالية الأداء. يقدم Swift عدة أدوات قوية للعمل مع العمليات غير المتزامنة: بدءًا من Grand Central Dispatch (GCD) الكلاسيكي وصولاً إلى النموذج الحديث async/await وإطار العمل Combine. في هذه المقالة، سنستعرض الأساليب الرئيسية وخصائصها وأمثلة على استخدامها.



1. Grand Central Dispatch (GCD) — أساس تعدد الخيوط



GCD هي مكتبة منخفضة المستوى من Apple لإدارة التنفيذ المتوازي للكود. العنصر الأساسي هو DispatchQueue، والذي يمكن أن يكون تسلسليًا (serial) أو متوازيًا (concurrent).



القوائم الرئيسية:

  • main — القائمة الرئيسية (خيط واجهة المستخدم). يجب تنفيذ جميع تحديثات الواجهة عليها.
  • global — قوائم متوازية نظامية بأولويات مختلفة (background, utility, default, userInitiated, userInteractive).
  • custom — قوائم مخصصة يتم إنشاؤها عبر DispatchQueue(label:attributes:).


مثال: تحميل صورة في الخلفية

import UIKit

class ImageLoader { func loadImage(from url: URL, completion: @escaping (UIImage?) -> Void) { DispatchQueue.global(qos: .background).async { guard let data = try? Data(contentsOf: url), let image = UIImage(data: data) else { DispatchQueue.main.async { completion(nil) } return } DispatchQueue.main.async { completion(image) } } }}


2. OperationQueue — إدارة مرنة للمهام



OperationQueue هي تجريد أعلى مستوى فوق GCD. تتيح إنشاء تبعيات بين العمليات، وتعيين الحد الأقصى لعدد المهام المتوازية، وإلغاء العمليات.



الإمكانيات الرئيسية:

  • إنشاء BlockOperation أو فئات فرعية مخصصة من Operation.
  • تعيين التبعيات: operation2.addDependency(operation1).
  • إلغاء جميع العمليات: queue.cancelAllOperations().
  • التحكم في جودة الخدمة (quality of service).


مثال: تحميل الملفات بالتسلسل

import Foundation

let queue = OperationQueue()queue.maxConcurrentOperationCount = 1 // تنفيذ تسلسلي

let fetchMetadata = BlockOperation { print("جارٍ تحميل البيانات الوصفية...") Thread.sleep(forTimeInterval: 1)}

let downloadContent = BlockOperation { print("جارٍ تحميل المحتوى...") Thread.sleep(forTimeInterval: 2)}

downloadContent.addDependency(fetchMetadata)

queue.addOperations([fetchMetadata, downloadContent], waitUntilFinished: false)print("تم وضع العمليات في قائمة الانتظار")


3. Swift Concurrency (async/await) — النهج الحديث



بدءًا من Swift 5.5، قدمت Apple نموذجًا مدمجًا للعمليات غير المتزامنة مع الكلمات المفتاحية async و await. يتيح كتابة كود غير متزامن بشكل خطي، دون الحاجة إلى الإغلاقات (closures) و callback-ات.



المكونات الرئيسية:

  • async — وضع علامة على دالة غير متزامنة.
  • await — انتظار نتيجة عملية غير متزامنة.
  • Task — إنشاء سياق غير متزامن.
  • TaskGroup — تجميع المهام المتوازية.


مثال: تحميل البيانات بشكل متوازٍ

import Foundation

func fetchUser(id: Int) async -> String { // محاكاة طلب شبكة try? await Task.sleep(nanoseconds: 1_000_000_000) return "User_\\(id)"}

func loadAllUsers() async { await withTaskGroup(of: String

توصيات