قوائم المهام لـ 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 أيضاً في المكتبة
العمل مع Markdown في Kotlin: المكتبات، التحليل والتوليد
ترحيلات قواعد البيانات في C# (.NET): Entity Framework و FluentMigrator وغيرها من الأساليب
Cheerio لجافا سكريبت (Node.js): دليل شامل مع أمثلة
ORM لـ Kotlin: مقارنة وأمثلة (Exposed, Ktorm, Hibernate)
Sinon لجافا سكريبت (Node.js): دليل شامل مع أمثلة