قوائم المهام في Swift: GCD وOperationQueue وSwift Concurrency

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

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

ابدأ الدورة

قوائم المهام لـ Swift (iOS/macOS): GCD وOperationQueue وSwift Concurrency



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



1. Grand Central Dispatch (GCD) — DispatchQueue



GCD هي مكتبة منخفضة المستوى بلغة C، مدمجة في نواة النظام. في Swift، يتم تمثيلها بواسطة الفئة DispatchQueue. تسمح بتنفيذ كتل من التعليمات البرمجية بشكل تسلسلي أو متزامن.



الأنواع الرئيسية لقوائم الانتظار:

  • Main Queue — قائمة انتظار تسلسلية تعمل على الخيط الرئيسي. تُستخدم لتحديث واجهة المستخدم.
  • Global Queues — قوائم انتظار متزامنة بأولويات مختلفة (QoS: userInteractive, userInitiated, utility, background).
  • Custom Queues — قوائم انتظار مخصصة (تسلسلية أو متزامنة).


مثال: تحميل بيانات غير متزامن مع تحديث واجهة المستخدم

import UIKit

class ViewController: UIViewController { @IBOutlet weak var imageView: UIImageView!

func loadImage(from url: URL) { // التبديل إلى قائمة انتظار الخلفية DispatchQueue.global(qos: .userInitiated).async { [weak self] in guard let data = try? Data(contentsOf: url), let image = UIImage(data: data) else { return }

// العودة إلى الخيط الرئيسي لتحديث واجهة المستخدم DispatchQueue.main.async { self?.imageView.image = image } } }}


العمل مع الإشارات والمجموعات

let group = DispatchGroup()let queue = DispatchQueue.global()

group.enter()queue.async { print("تم إنجاز المهمة 1") group.leave()}

group.enter()queue.async { print("تم إنجاز المهمة 2") group.leave()}

group.notify(queue: .main) { print("جميع المهام اكتملت")}


2. OperationQueue وOperation



OperationQueue هي طبقة فوقية على GCD، توفر واجهة موجهة للكائنات. كل مهمة هي مثيل من الفئة Operation (أو فئتها الفرعية BlockOperation). المزايا الرئيسية: إدارة التبعيات، إلغاء المهام، وضبط الحد الأقصى لعدد العمليات المتزامنة.



مثال: تحميل مع تبعيات

let queue = OperationQueue()queue.maxConcurrentOperationCount = 2

let fetchData = BlockOperation { print("جارٍ تحميل البيانات...")}

let processData = BlockOperation { print("جارٍ معالجة البيانات...")}

let updateUI = BlockOperation { print("جارٍ تحديث الواجهة")}

// تعيين التبعيات: processData سينفذ بعد fetchDataprocessData.addDependency(fetchData)updateUI.addDependency(processData)

queue.addOperations([fetchData, processData, updateUI], waitUntilFinished: false)


الأولويات وإلغاء المهام

let operation = BlockOperation {    if Task.isCancelled { return }    print("جارٍ التنفيذ...")}operation.queuePriority = .veryHigh

// إلغاء العمليةoperation.cancel()


3. Swift Concurrency (async/await)



بدءًا من Swift 5.5، قدمت Apple نموذجًا مدمجًا للبرمجة غير المتزامنة. يسمح async/await بكتابة كود غير متزامن بشكل خطي، دون استخدام الإغلاقات. المكونات الرئيسية: Task وTaskGroup وactor.



مثال: تحميل صورة غير متزامن

import UIKit

class ImageLoader { func loadImage(from url: URL) async throws -> UIImage { let

توصيات