Threading در سوئیفت — به زبان ساده
در صورتی که با سابقه برنامهنویسی در پلتفرمهای دیگر به سمت سوئیفت آمده باشید، یا در صورتی که هنوز تجربه کمی در این زبان داشته باشید، احتمالاً در زمینه درک Threading در iOS با مشکل مواجه میشوید. در این مقاله نکاتی در مورد Threading در سوئیفت با بهرهگیری از GCD معرفی میکنیم.
توجه داشته باشید که Threading به طور کامل در مورد شیوه مدیریت اولویتبندی کارها در اپلیکیشن است. سریعتر ساختن اجرای کد بسیار عالی است، اما آن چه مهمتر است میزان سرعتی است که کاربر هنگام کار با اپلیکیشن حس میکند. هدف ما به عنوان توسعهدهنده این است که هر چیزی که کاربر میبیند و با آن تعامل دارد را در بالاترین اولویت قرار دهیم. بدین ترتیب اپلیکیشن در نظر کاربر سریعتر و روانتر به نظر میرسد. از کاربر نخواهید که منتظر بارگذاری چیزی بماند که به آن اهمیت نمیدهد یا متوجه آن نیست.
تنها از Thread اصلی برای بهروزرسانی نماها استفاده کنید
این سادهترین روش برای جلوگیری از بروز مشکل است. ایده اصلی آن است که مطمئن شویم همه نماها و عناصر اینترفیس از سوی آیتمهای دیگر در صف اصلی مسدود نمیشوند. به مثال زیر توجه کنید:
بدین ترتیب با اجرای کارهای مرتبط با UI صرفاً در نخ اصلی مطمئن میشویم که کاربر از بارگذاری یک نما یا خروج از یک نما منع نمیشود. همچنین نباید از تابعهایی استفاده کنیم که عوارض جانبی به صورت بارگذاری داده، تصویر و غیره روی نخ اصلی دارند.
با انواع کیفیتهای سرویس GCD آشنا شوید
اولویتبندیهای مختلفی برای اجرای کار در iOS وجود دارند. کیفیتهای بالاتر ابتدا اولویتبندی میشوند و مستقیماً مدیریت خواهند شد؛ در حالی که سرویسهای با کیفیت پایینتر زمانی مدیریت میشوند که برخی منابع سیستم آزاد شود.
کیفیتهای مختلف وقتی از بالا به پایین رتبهبندی شوند به صورت زیر هستند:
کلاس QoS | نوع کار و تمرکز QoS | مدت کاری که باید اجرا شود |
---|---|---|
کارهای نیازمند تعامل با کاربر | این دسته کارهایی که با کاربر تعامل دارند مانند عملیاتی روی نخ اصلی، رفرش کردن اینترفیس کاربر و یا اجرای انیمیشن را شامل میشود. اگر کار به سرعت اجرا نشود، اینترفیس کاربری ممکن است قفل شود. تمرکز این دسته روی پاسخگویی و عملکرد است. | کار عملاً آنی صورت میگیرد. |
کارهای آغاز شده از سوی کاربر | کارهایی که کاربر آغاز میکند و نیازمند نتایج سریع است مانند باز کردن یک سند ذخیره شده یا اجرای یک عمل پس از کلیک کاربر روی اینترفیس در این دسته جای میگیرند. این کارها برای تداوم تعامل کاربر ضروری هستند. تمرکز این دسته روی پاسخگویی و عملکرد است. | کارها تقریباً به صورت آنی انجام مییابند، مثلاً چند ثانیه یا کمتر طول میکشد. |
کاربردی | کارهایی که مدت زمانی طول میکشند تا تکمیل شوند و نتیجه آنی نیاز ندارند مانند دانلود کردن یا ایمپورت دادهها را شامل میشود. وظایف کاربردی به طور معمول یک نوار پیشروی دارند که در معرض دید کاربر است. در این دسته تمرکز روی ارائه موازنهای بین پاسخگویی، عملکرد و کارایی انرژی است. | کارها از چند ثانیه تا چند دقیقه طول میکشند. |
پسزمینه | کارهایی مانند اندیس کردن، همگامسازی و پشتیبانگیری، در دسته پسزمینه جای میگیرند و در معرض دید کاربر نیستند. در این دسته تمرکز روی کارایی انرژی است. | کارها زمان زیادی طول میکشند، مثلاً ممکن است چند دقیقه یا ساعت به طول بینجامند. |
ساخت یک صف از روی کیفیت سرویس کار واقعاً آسانی است. کافی است یک نام و یک QoS برای آن تعیین کنید:
بدانید هر لحظه روی کدام Thread هستید
برای یافتن این که در حال حاضر روی کدام Thread قرار داریم، در هر بخش از کد میتوان از Thread.current استفاده کرد:
بدین ترتیب میتوانید دقیقاً اولویتبندی تابعی که اجرا شده است را ببینید.
همچنین میتوانید با کد زیر به صورت خاص بررسی کنید که آیا روی نخ اصلی قرار دارید یا نه:
Thread.current.isMainThread
تقریباً همیشه از Async استفاده کنید
این یکی از سادهترین اشتباهاتی است که در زمان استفاده از threading مرتکب میشویم، اما جلوگیری از آن نیز دقیقاً به همین سادگی است.
استفاده از متدهای همگام (Sync) در کد مزیتهایی دارد و در برخی موارد خاص هم به آن نیاز داریم، اما برای کسی که به تازگی برنامهنویسی iOS را آغاز کرده است، اجتناب از متدهای همگام بهترین رویه محسوب میشود. بنابراین هرگز مانند کاری که در مثال زیر انجام یافته، روی DispatchQueue اصلی متد sync فراخوانی نکنید:
همچنین از استفاده از sync روی صف userInteractive. خودداری کنید، زیرا در همان سطح اولویت صف اصلی است.
اگر این مطلب برای شما مفید بوده است، آموزشهای زیر نیز به شما پیشنهاد میشوند:
- مجموعه آموزشهای برنامهنویسی
- آموزش برنامه نویسی Swift (سوئیفت) برای برنامه نویسی iOS
- مجموعه آموزشهای دروس علوم و مهندسی کامپیوتر
- آموزش سوئیفت (Swift) — مجموعه مقالات مجله فرادرس
- توسعه یک اپلیکیشن MacOS ساده — از صفر تا صد
==