در این جلسه میخواهیم در مورد چند موضوع مهم در مورد برنامه نویسی صحبت کنیم.
Thread ها به عنوان کوچک ترین واحد اجرایی در سیستم عامل ها حساب میشوند.
در برنامهنویسی iOS، مفهوم Thread (رشته) به اجرای هم زمان یا موازی کد اشاره دارد و برای انجام وظایف مختلف به طور هم زمان بدون متوقف کردن رابط کاربری (UI) استفاده میشود.
در واقع دنباله ای از دستورات داریم که باید در زمان مناسب اجرا شوند.
و نکته ای که در iOS بسیار مهم است، بروز بودن و پاسخگو بودن دائمی UI است. که Thread ها راهی برای بهبود عملکرد برنامه است. و با اجرای چندین دستورالعمل به طور همزمان امکان پاسخگو بودن دائمی رابط کاربری را فراهم میکند.
Thread اصلی برنامه و اپلیکیشن ما است که برای کارهای مرتبط با رابط کاربری (UI) استفاده میشود.
هر چیزی که تغییرات مستقیم در UI ایجاد میکند (مثل تغییر متن دکمه، بهروزرسانی لیستها یا نمایش یک ویو جدید) باید روی Main Thread اجرا شود.
که برای انجام کارهای سنگین یا زمان بر استفاده میشود (مثل دانلود فایل، خواندن داده از شبکه یا محاسبات پیچیده).
هدف استفاده از نخهای پسزمینه این است که رابط کاربری قفل نشود و برنامه همچنان پاسخگو (responsive) باقی بماند.
قبل از این که بخواهیم در مورد Dispatch Queue صحبت کنیم بهتر است آشنایی با GCD داشته باشیم.
GCD مخفف Grand Central Dispatch است که یک فریم ورک توسعه داده شده توسط اپل است که با کمک آن میتوانیم کد ها را به صورت همزمان و multi thread اجرا کنیم.
یک Dispatch Queue یک صف (queue) است که تسکها را برای اجرا مدیریت میکند.
که این وظایف را میتوان به صورت سریال یا همزمان در رشته اصلی برنامه شما (main thread) یا در یک رشته پس زمینه (background thread) مدیریت می کند.
حال میخواهیم این دو صف را در برنامه نویسی iOS با هم مقایسه کنیم.
در این صف یک وظیفه یا task در هر لحظه اجرا میشود. و پس از پایان وظیفه اول وظیفه بعدی شروع به اجرا میشود.
task ها بصورت همزمان اجرا میشوند. ترتیب اجرای task ها بصورت دقیق مشخص نیست و ممکن است با هم همپوشانی داشته باشند.
حال میخواهیم شما را با دو مفهوم دیگر یعنی async و sync آشنا کنیم.
Async به معنای اجرای ناهمگام است، یعنی تسک ها به صورت موازی اجرا میشوند و کدهای بعدی بلافاصله بدون انتظار برای اتمام تسک قبلی اجرا میشوند.
از Async برای اجرای تسکها در پسزمینه و جلوگیری از قفل شدن برنامه استفاده میشود
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")
در انتها یک خلاصه و جمع بندی داشته باشیم.