
DispatchQueue.global() ומריצים q.async עם בלוק קוד. הדמו משתמש ב-sleep של שלוש שניות ומדפיס "pump can is ready". הפונקציה חוזרת מיד, וההדפסה מופיעה רק אחרי שלוש שניות.DispatchQueue.main.async ושם מעדכנים את הממשק.userInteractive (אנימציות, תגובה מיידית), userInitiated (המשתמש מחכה לתשובה), default, utility (משימות ארוכות עם מחוון התקדמות, כמו תנועת רשת) ו-background (תחזוקה וניקוי שהמשתמש לא מודע אליהם).DispatchQueue(label:) עם שם ייחודי הוא תור טורי כברירת מחדל, ושלוש משימות רצות אחת אחרי השנייה. כדי לקבל תור מקבילי, מוסיפים attributes עם concurrent.הטקסט המלא של הדקות הראשונות בהרצאה «עבודה עם GCD - עבודה אסינכרונית ב-Xcode» בקורס הווידאו של PracticU – כתוביות בעברית עם זמן התחלה לכל פסקה. כך תוכלו לקרוא ולחפש את הנושאים לפני שמתחילים ללמוד.
שלום וברוכים הבאים. אחרי שלמדנו לעבוד עם ג'ייסון אנחנו רוצים לעבור לנושא הבא שלנו, הלוא הוא GCD. GCD היא מערכת של אפל שמאפשרת לנו להריץ קוד בצורה סינכרונית, להריץ קוד ברקע.
למה שאני ארצה להריץ קוד ברקע? כי אנחנו לא רוצים לתקוע את ממשק המשתמש, אנחנו רוצים שהאפליקציה שלנו תמשיך לרוץ בזמן שאנחנו עושים משימות שעלולות לקחת הרבה זמן.
לדוגמה אם אנחנו רוצים להביא מידע מהאינטרנט זה עלול לקחת הרבה זמן ואנחנו לא רוצים שהממשק משתמש יהיה תקוע וימתין GCD נותנת לנו בעצם אפשרות להריץ משימות בצורה של closures מול המערכת וברגע שסיימנו להריץ משימות ברקע אנחנו נרצה לדווח על התוצאה על ה-UI טרד אוקיי אז GCD נותנת לי בעצם את האפשרות לעבוד ברקע ואחר כך אני אצטרך גם
להחזיר את התוצאות ל-UI טרד כי כדי לעדכן ממשק משתמש, לעדכן UI, אנחנו חייבים לעשות זאת על ה-UI-thread. אוקיי.
עכשיו, GCD נותנת לנו אפשרויות כאלה. היא נותנת לנו אפשרות להריץ משימות בטור, זאת אומרת משימות אחת אחרי השנייה. יש לנו גם אפשרות ב-GCD להריץ משימות במקביל, וברגע שסיימנו להריץ את המשימות שלנו, אנחנו רוצים לדווח ל-UI-thread.
זה דבר אחד שרציתי להגיד. מעבר לזה, ה-GCD נותנת לנו בעצם אפשרות לעבוד עם תורי משימות, שמוגדרים מראש במערכת ההפעלה, אוקיי? ואנחנו נדבר עליהם.
מעבר לזה, אנחנו גם יכולנו להגדיר לעצמנו תורי משימות של האפליקציה, שבסופו של דבר גם הם ירוצו לתורים הגלובליים של מערכת ההפעלה, אבל זה כבר עניין של אימפלימנטציה.
טוב, אז אחרי כל הדיבורים האלה, בואו נקפוץ שנייה ל-Xcode ונראה למה אני מתכוון פה. אז אנחנו נפתח את Xcode, נייצר לנו פרויקט חדש, Single View Application, נקרא לזה gcd-demo ונתקדם.
עכשיו בפרויקט בואו נייצר לעצמנו פה איזשהו קובץ שנוכל לעבוד בו, אז אנחנו נייצר swift-file ובוא נקרא לזה נניח pump-can.
אני אגדיר פה פונקציה, נקרא לזה grow-pump-can וכרגע היא פונקציה רגילה לגמרי, נכון? עוד לא עשינו שום שימוש ב-gcd. כדי לעבוד עם gcd אנחנו בעצם עובדים עם תורים, ותורים אז בואו נגדיר לעצמנו תור.
תורים מוגדרים על ידי קריאה ל-dispatch queue וכאן יש לי אפשרות או לעשות dispatch queue חדש כלומר לקרוא ל-init או להשתמש באחד התורים הגלובליים נניח שאנחנו נעשה את ההיכרות שלנו עם dispatch queue גלובל זה תור אחד גלובלי וזה ה-queue שלי על ה-queue אנחנו רוצים להריץ משימות וכדי להריץ משימות אנחנו אומרים q.async ופה אנחנו מעבירים בלוק של קוד שירוץ ברקע
אוקיי אז אם אני ארשום פה הערה זה יהיה קוד שרץ ברקע למשל החלטנו שאנחנו רוצים לתת למחשב שלנו לישון קצת לשלוש שניות, אוקיי?
הסליפ פה זה מתודה שמרדימה את הטרד שעליו הקוד רץ, והיא תרדים אותו לשלוש שניות. זאת אומרת שהטרד הזה יהיה חופשי לעשות משימות אחרות במערכת הפעלה, הוא לא באמת הולך לנוח, אבל שוב פעם עניין של אימפלמנטציה.
כעבור שלוש שניות החלטנו להדפיס Pump Can is Ready, אוקיי? עכשיו בואו ננסה לקרוא לפונקציה הזאת Grow Pump Can ונראה בעצם איך הדבר הזה מתנהל.
אז אני אפתח את הויו קונטרולר בצד ימין ובואו נכתוב פה את השם של הפעולה גו פאמפקן ונריץ את זה. עכשיו מה שמעניין זה שהפונקציה הזאת מיד מיד מחזירה תשובה זאת אומרת אם אני עכשיו אעשה פה פרינט done מבחינת הויו קונטרולר אני אראה את הפרינט הזה קודם ורק אחרי שלוש שניות אני אראה את פאמפקן is ready בואו נבדוק את
העניין. אוקיי, אז ה-view controller מבחינתו הוא סיים, הוא קרא לפונקציה והיא הסתיימה, היא החזירה מיד ערך, אוקיי, השליטה מיד חוזרת ל-UI-thread, ואחרי כמה זמן, אחרי שלוש שניות, אז הפעם כן שלנו is ready.
טוב, נחמד. אבל אם אנחנו באמת רוצים לדווח תוצאה ואנחנו רוצים לעדכן UI, אז הכלל הבא שאתם צריכים ללמוד, יש לכם שתי כללים שאני רוצה להגיד.
כלל אחד, אם יש לכם משימה שלוקחת הרבה זמן, אל תעשו אותה פה ל-UI-thread, אתם צריכים לעשות אותה באיזשהו דיספייץ' כלל מספר שתיים כשאתם מעדכנים את ה-UI אתם מעדכנים אותו אך ורק על המיין טרד אסור לכם לעשות את זה אחרת כדי לעבוד עם המיין טרד שוב פעם יש לנו קיו מתאים והקיו הזה זה דיספייץ' קיו מיין כאן אני יכול לתת משימות ל-UI טרד שיריץ אותן מתי שהוא
יכול מתי שהוא מתפנה ושוב פעם אנחנו עובדים פה עם הסינק ועכשיו אנחנו בעצם יכולים לעדכן את ה-UI אז לפי הכלל השני את הפרינט סטייטמנט שלנו או סט טקסט על איזשהו לייבל וכן הלאה אנחנו עושים כאן בדיספאצ' קיו מיין אוקיי על הדיספאצ' קיו של ה-UI טרד וכאן בוא נגיד פאמפ קן איז רדי וככה בעצם אנחנו אמורים לעבוד בסדר אני מריץ משימה ברקע היא
יכולה לקחת הרבה זמן ולכן היא חייבת להיות ברקע ואז אנחנו יכולים להדפיס את התוצאה או לשנות UI רק על ה-UI טרד אני מריץ וזה בעצם ההיכרות הראשונה שלנו פה עם GCD אוקיי עכשיו יש כמה dispatch cues שאתם צריכים להכיר אם אתם רוצים לבוא ולעבוד עם המערכת הזאת אז בואו נכיר אותה.
בוא נגיד let q1 שווה dispatch q main סליחה dispatch q global עכשיו כמו שאתם רואים יש לנו פה עוד אופציה לתת פרמטר שנקרא quality of service אוקיי עכשיו quality of service יכול להיות אחד מהרשימה הבאה הרשימה הולכת ככה יש לנו את הuser is interactive אוקיי User Interactive זה בעצם פריוריטי של הטרד או של ה-Q יותר נכון של תור המשימות וזה הפריוריטי הגבוה ביותר.
כלומר המשימות שאני נותן פה הן בדחיפות ממעלה ראשונה אם אני אתן ל-Q1 עכשיו משימה אז זה יהיה מאוד מאוד מאוד חשוב. יש לנו עוד אפשרות להגדיר תורים אחרים בוא נקרא רגע ל-Q הראשון User Interactive ואז נגדיר את ה-Q הבא User Initiated אוקיי ושוב פעם dispatch queue ו-global ואנחנו נותנים quality of service וכאן אנחנו נגיד פשוט
user initiating טוב בואו נראה רגע דוקומנטציה לגבי ה-quality of service כדי שיהיה לכם את כל התמונה המלאה מתי להשתמש באיזשהו quality of service מסוים אז בואו נכתוב swift quality of service ונלך פה על הדוקומנטציה הרשמית של developer.apple.com ופה יש לנו בעצם את ה-quality of services את הרשימה שלהם הם
הם מסודרים פה מהסדר של התור הכי חשוב ועד לתורים הכי פחות חשובים. אז היוזר אינטראקטיב זה ה-Q הכי חשוב, כאן אנחנו נרצה להריץ דברים שמעדכנים ממש UI, למשל אנימציות, טיפול באירועים או לעדכן את הממשק משתמש או דברים שממש ממש היוזר הפעיל והיוזר עכשיו מצפה מיד מיד לתגובה.
ה-quality of service הבא זה user initiated. משימות מאוד חשובות, בסדר? ממעלה שנייה מה שנקרא, היוזר מצפה לתשובה, ובינתיים הוא לא יכול להמשיך לעבוד.
יש לנו את ה-Default Quality of Service שהוא פשוט מתחת לשתי אלה, אוקיי? זה מה שגם כתוב בדוקומנטציה. אז בואו נקרא כאן, Default Task זה פחות חשוב מ-User Initiated ו-User Interactive, אבל יותר חשוב מ-Utility ו-Background, הוא נמצא ביניהם כמו שאמרתי, ואנחנו ניתן את ה-Q הזה, את הקלאס הזה ל-Q, אם אנחנו רוצים לעשות משימות בעבור המשתמש
שהמשתמש התחיל והן קצת פחות חשובות. ה-quality of service הבא זה utility. כאן אנחנו נציג משימות, המשימות שאנחנו נעבוד איתן כאן הן יהיו משימות שלוקחות יחסית הרבה זמן אבל עדיין היוזר מודע אליהן והיוזר רוצה