آشنایی با Thread و Dispatch Queue در سوئیفت

زمان مطالعه : ۳ دقیقه
آخرین بروزرسانی : ۲۵ آذر ۱۴۰۳
معرفی dispatch queue و thread

در این جلسه میخواهیم در مورد چند موضوع مهم در مورد برنامه نویسی صحبت کنیم.

Thread چیست؟

Thread ها به عنوان کوچک ترین واحد اجرایی در سیستم عامل ها حساب میشوند.

در برنامه‌نویسی iOS، مفهوم Thread (رشته) به اجرای هم‌ زمان یا موازی کد اشاره دارد و برای انجام وظایف مختلف به ‌طور هم ‌زمان بدون متوقف کردن رابط کاربری (UI) استفاده می‌شود.

در واقع دنباله ای از دستورات داریم که باید در زمان مناسب اجرا شوند.

و نکته ای که در iOS بسیار مهم است، بروز بودن و پاسخگو بودن دائمی UI است. که Thread ها راهی برای بهبود عملکرد برنامه است. و با اجرای چندین دستورالعمل به طور همزمان امکان پاسخگو بودن دائمی رابط کاربری را فراهم میکند.

Main Thread

Thread اصلی برنامه و اپلیکیشن ما است که برای کارهای مرتبط با رابط کاربری (UI) استفاده می‌شود.

هر چیزی که تغییرات مستقیم در UI ایجاد می‌کند (مثل تغییر متن دکمه، به‌روزرسانی لیست‌ها یا نمایش یک ویو جدید) باید روی Main Thread اجرا شود.

Background Thread

که برای انجام کارهای سنگین یا زمان ‌بر استفاده می‌شود (مثل دانلود فایل، خواندن داده از شبکه یا محاسبات پیچیده).

هدف استفاده از نخ‌های پس‌زمینه این است که رابط کاربری قفل نشود و برنامه همچنان پاسخگو (responsive) باقی بماند.

قبل از این که بخواهیم در مورد Dispatch Queue صحبت کنیم بهتر است آشنایی با GCD داشته باشیم.

GCD چیست؟

GCD مخفف Grand Central Dispatch است که یک فریم ورک توسعه داده شده توسط اپل است که با کمک آن میتوانیم کد ها را به صورت همزمان و multi thread اجرا کنیم.

Dispatch Queue چیست؟

یک Dispatch Queue یک صف (queue) است که تسک‌ها را برای اجرا مدیریت می‌کند.

که این وظایف را میتوان به صورت سریال یا همزمان در رشته اصلی برنامه شما (main thread) یا در یک رشته پس زمینه (background thread) مدیریت می کند.

بررسی صف های Serial و Concurrent

صف serial و صف concurrent

حال میخواهیم این دو صف را در برنامه نویسی iOS با هم مقایسه کنیم.

Serial Queue

در این صف یک وظیفه یا task در هر لحظه اجرا میشود. و پس از پایان وظیفه اول وظیفه بعدی شروع به اجرا میشود.

Concurrent Queue

task ها بصورت همزمان اجرا میشوند. ترتیب اجرای task ها بصورت دقیق مشخص نیست و ممکن است با هم همپوشانی داشته باشند.

حال میخواهیم شما را با دو مفهوم دیگر یعنی async و sync آشنا کنیم.

Async

Async به معنای اجرای ناهمگام است، یعنی تسک‌ ها به صورت موازی اجرا می‌شوند و کدهای بعدی بلافاصله بدون انتظار برای اتمام تسک قبلی اجرا می‌شوند.

از Async برای اجرای تسک‌ها در پس‌زمینه و جلوگیری از قفل شدن برنامه استفاده می‌شود

Sync

Sync به معنای اجرای همگام است، یعنی اجرای تسک فعلی تا زمانی که تمام نشود، اجرای کدهای بعدی متوقف می‌شود.

به عبارتی، کدها به ترتیب اجرا می‌شوند و تسک فعلی باید تمام شود تا تسک بعدی شروع شود.

حال بریم سراغ انواع ترکیب های async و sync با صف های serial و concurrent

let serialQueue = DispatchQueue(label: "ir.SwiftAcademy.serialQueue")

print("Start of serial sync program")
serialQueue.sync {
    print("Task 1 started")
    Thread.sleep(forTimeInterval: 2) // شبیه‌سازی تأخیر 2 ثانیه‌ای
    print("Task 1 ended")
}

serialQueue.sync {
    print("Task 2 started")
    Thread.sleep(forTimeInterval: 2) // شبیه‌سازی تأخیر 1 ثانیه‌ای
    print("Task 2 ended")
}
print("After tasks")

حال خروجی را ببینیم:

Start of serial sync program
Task 1 started
Task 1 ended
Task 2 started
Task 2 ended
After tasks

حال بریم سراغ حالت serial و async

let serialQueue = DispatchQueue(label: "ir.SwiftAcademy.serialQueueAsync")

print("Start of serial async program")
serialQueue.async {
    print("Task 1 started")
    Thread.sleep(forTimeInterval: 2) // شبیه‌سازی تأخیر 2 ثانیه‌ای
    print("Task 1 ended")
}

serialQueue.async {
    print("Task 2 started")
    Thread.sleep(forTimeInterval: 2) // شبیه‌سازی تأخیر 1 ثانیه‌ای
    print("Task 2 ended")
}
print("After tasks")

حال خروجی را ببینیم:

Start of serial async program
Task 1 started
After tasks
Task 1 ended
Task 2 started
Task 2 ended

حالت بعدی بصورت concurrent و sync میباشد.

let concurrentQueue = DispatchQueue(label: "ir.SwiftAcademy.concurrentQueue", attributes: .concurrent)

print("Start of concurrent sync program")
concurrentQueue.sync {
    print("Task 1 started")
    Thread.sleep(forTimeInterval: 2) // شبیه‌سازی تأخیر 2 ثانیه‌ای
    print("Task 1 ended")
}

concurrentQueue.sync {
    print("Task 2 started")
    Thread.sleep(forTimeInterval: 2) // شبیه‌سازی تأخیر 1 ثانیه‌ای
    print("Task 2 ended")
}
print("After tasks")

حال خروجی را ببینیم:

Start of concurrent sync program
Task 1 started
Task 1 ended
Task 2 started
Task 2 ended
After tasks

و اما حالت اخر concurrent و async هست

let concurrentQueue = DispatchQueue(label: "ir.SwiftAcademy.concurrentQueue", attributes: .concurrent)

print("Start of concurrent async program")
concurrentQueue.async {
    print("Task 1 started")
    Thread.sleep(forTimeInterval: 2) // شبیه‌سازی تأخیر 2 ثانیه‌ای
    print("Task 1 ended")
}

concurrentQueue.async {
    print("Task 2 started")
    Thread.sleep(forTimeInterval: 2) // شبیه‌سازی تأخیر 1 ثانیه‌ای
    print("Task 2 ended")
}
print("After tasks")

در انتها یک خلاصه و جمع بندی داشته باشیم.

  • Main Thread: برای تغییرات UI استفاده می‌شود.
  • Background Thread: برای کارهای سنگین یا طولانی.
  • Sync: اجرای تسک به ترتیب، تا زمانی که یک تسک تمام نشود، تسک بعدی شروع نمی‌شود.
  • Async: اجرای تسک‌ ها به صورت همزمان، بدون توقف سایر کدها.
  • Serial Queue: تسک ‌ها یکی ‌یکی و به ترتیب اجرا می‌شوند.
  • Concurrent Queue: تسک‌ ها همزمان اجرا می‌شوند.
میلاد خط شب
میلاد خط شب
معتقدم هر آدمی میتواند در یک زمینه ای مفید و تاثیر گذار باشد و اصولا آدم "غیر مفید" نداریم. فقط کافی است به موقع و صحیح راهنمایی شود.
پاسخ دهید


به این مقاله علاقه داشتید؟ 🥰

7