PracticU

עבודה עם GCD - עבודה אסינכרונית ב-Xcode

בלי כתוביותעם כתוביות
PracticU › קורס פיתוח אפליקציות - לאייפון iPhone iOS - ב-Swift-Xcode › עבודה עם GCD - עבודה אסינכרונית ב-Xcode
מילון מושגים:
אסינכרוני - אופן פעולה שבו פעולה ארוכה רצה ברקע והתוכנית ממשיכה בלי להמתין לה, ומטופלת כשתסתיים.
Xcode - סביבת הפיתוח של אפל לכתיבת אפליקציות ל-iOS ול-macOS.
ממשק - נקודת מגע בין רכיבים: ממשק משתמש שבו אדם מפעיל תוכנה, או ממשק תכנותי שמגדיר אילו פעולות רכיב אחד חושף לאחר.
תהליכון - יחידת ביצוע בתוך תהליך, המאפשרת להריץ כמה מהלכים במקביל ולחלוק את אותו זיכרון.
פונקציה - קטע קוד בעל שם שמבצע משימה מוגדרת, מקבל ערכי קלט (פרמטרים) ויכול להחזיר תוצאה. מאפשרת לארגן קוד ולהשתמש בו שוב.

עבודה עם GCD - עבודה אסינכרונית ב-Xcode
GCD היא מערכת של אפל להרצת קוד ברקע, כדי שממשק המשתמש לא ייתקע בזמן משימות ארוכות, כמו הבאת מידע מהאינטרנט. השיעור מציג את התורים (queues) של GCD ואת ההבדל בין תור טורי לתור מקבילי.
השלבים העיקריים
1. שני כללים: משימה שלוקחת זמן לא רצה ב-UI thread אלא בתור ברקע. עדכון של ממשק המשתמש נעשה אך ורק ב-main thread.
2. משימה ראשונה: בפרויקט gcd-demo יוצרים תור עם DispatchQueue.global() ומריצים q.async עם בלוק קוד. הדמו משתמש ב-sleep של שלוש שניות ומדפיס "pump can is ready". הפונקציה חוזרת מיד, וההדפסה מופיעה רק אחרי שלוש שניות.
3. דיווח ל-UI: בתוך הבלוק מפעילים DispatchQueue.main.async ושם מעדכנים את הממשק.
4. Quality of Service: תורים גלובליים מקבלים רמת עדיפות לפי הסדר מהחשובה ביותר: userInteractive (אנימציות, תגובה מיידית), userInitiated (המשתמש מחכה לתשובה), default, utility (משימות ארוכות עם מחוון התקדמות, כמו תנועת רשת) ו-background (תחזוקה וניקוי שהמשתמש לא מודע אליהם).
5. תורים מקביליים: כל התורים הגלובליים הם concurrent. שלוש משימות של שלוש שניות רצות יחד, ואין שליטה בסדר סיומן. המשימות נכנסות לפי הסדר (FIFO), אבל מי מסיים ראשון אינו בשליטה.
6. תור משלך: DispatchQueue(label:) עם שם ייחודי הוא תור טורי כברירת מחדל, ושלוש משימות רצות אחת אחרי השנייה. כדי לקבל תור מקבילי, מוסיפים attributes עם concurrent.
שימו לב
- המערכת מנהלת בריכת threads (thread pool) ואינה הורגת אותם מיד אחרי יצירתם.
- בשיעור הבא ממשיכים באותו פרויקט עם דוגמה מעשית.
אחרי השיעור אפשר להריץ משימות ארוכות ברקע, לבחור תור לפי רמת חשיבות ולעדכן את הממשק מה-main thread.
השיעור הבא בקורס: הורדת תמונות מהאינטרנט ב-Xcode

פרקי ההרצאה: עבודה עם GCD - עבודה אסינכרונית ב-Xcode

  1. 00:00

    מה זה GCD ולמה לעבוד ברקע

  2. 00:55

    משימות בטור ובמקביל

  3. 01:49

    פרויקט חדש ופונקציה לדוגמה

  4. 02:58

    הרצת קוד ברקע עם DispatchQueue

  5. 04:14

    הפונקציה מחזירה שליטה מיד

  6. 05:12

    עדכון UI רק ב-main queue

  7. 06:33

    Quality of Service של תורים

  8. 07:50

    רמות העדיפות בדוקומנטציה של Apple

תמלול ההרצאה: עבודה עם GCD - עבודה אסינכרונית ב-Xcode

הטקסט המלא של הדקות הראשונות בהרצאה «עבודה עם GCD - עבודה אסינכרונית ב-Xcode» בקורס הווידאו של PracticU – כתוביות בעברית עם זמן התחלה לכל פסקה. כך תוכלו לקרוא ולחפש את הנושאים לפני שמתחילים ללמוד.

  1. 00:02

    שלום וברוכים הבאים. אחרי שלמדנו לעבוד עם ג'ייסון אנחנו רוצים לעבור לנושא הבא שלנו, הלוא הוא GCD. GCD היא מערכת של אפל שמאפשרת לנו להריץ קוד בצורה סינכרונית, להריץ קוד ברקע.

  2. 00:16

    למה שאני ארצה להריץ קוד ברקע? כי אנחנו לא רוצים לתקוע את ממשק המשתמש, אנחנו רוצים שהאפליקציה שלנו תמשיך לרוץ בזמן שאנחנו עושים משימות שעלולות לקחת הרבה זמן.

  3. 00:26

    לדוגמה אם אנחנו רוצים להביא מידע מהאינטרנט זה עלול לקחת הרבה זמן ואנחנו לא רוצים שהממשק משתמש יהיה תקוע וימתין GCD נותנת לנו בעצם אפשרות להריץ משימות בצורה של closures מול המערכת וברגע שסיימנו להריץ משימות ברקע אנחנו נרצה לדווח על התוצאה על ה-UI טרד אוקיי אז GCD נותנת לי בעצם את האפשרות לעבוד ברקע ואחר כך אני אצטרך גם

  4. 00:53

    להחזיר את התוצאות ל-UI טרד כי כדי לעדכן ממשק משתמש, לעדכן UI, אנחנו חייבים לעשות זאת על ה-UI-thread. אוקיי.

  5. 01:03

    עכשיו, GCD נותנת לנו אפשרויות כאלה. היא נותנת לנו אפשרות להריץ משימות בטור, זאת אומרת משימות אחת אחרי השנייה. יש לנו גם אפשרות ב-GCD להריץ משימות במקביל, וברגע שסיימנו להריץ את המשימות שלנו, אנחנו רוצים לדווח ל-UI-thread.

  6. 01:18

    זה דבר אחד שרציתי להגיד. מעבר לזה, ה-GCD נותנת לנו בעצם אפשרות לעבוד עם תורי משימות, שמוגדרים מראש במערכת ההפעלה, אוקיי? ואנחנו נדבר עליהם.

  7. 01:31

    מעבר לזה, אנחנו גם יכולנו להגדיר לעצמנו תורי משימות של האפליקציה, שבסופו של דבר גם הם ירוצו לתורים הגלובליים של מערכת ההפעלה, אבל זה כבר עניין של אימפלימנטציה.

  8. 01:43

    טוב, אז אחרי כל הדיבורים האלה, בואו נקפוץ שנייה ל-Xcode ונראה למה אני מתכוון פה. אז אנחנו נפתח את Xcode, נייצר לנו פרויקט חדש, Single View Application, נקרא לזה gcd-demo ונתקדם.

  9. 02:12

    עכשיו בפרויקט בואו נייצר לעצמנו פה איזשהו קובץ שנוכל לעבוד בו, אז אנחנו נייצר swift-file ובוא נקרא לזה נניח pump-can.

  10. 02:32

    אני אגדיר פה פונקציה, נקרא לזה grow-pump-can וכרגע היא פונקציה רגילה לגמרי, נכון? עוד לא עשינו שום שימוש ב-gcd. כדי לעבוד עם gcd אנחנו בעצם עובדים עם תורים, ותורים אז בואו נגדיר לעצמנו תור.

  11. 02:58

    תורים מוגדרים על ידי קריאה ל-dispatch queue וכאן יש לי אפשרות או לעשות dispatch queue חדש כלומר לקרוא ל-init או להשתמש באחד התורים הגלובליים נניח שאנחנו נעשה את ההיכרות שלנו עם dispatch queue גלובל זה תור אחד גלובלי וזה ה-queue שלי על ה-queue אנחנו רוצים להריץ משימות וכדי להריץ משימות אנחנו אומרים q.async ופה אנחנו מעבירים בלוק של קוד שירוץ ברקע

  12. 03:25

    אוקיי אז אם אני ארשום פה הערה זה יהיה קוד שרץ ברקע למשל החלטנו שאנחנו רוצים לתת למחשב שלנו לישון קצת לשלוש שניות, אוקיי?

  13. 03:42

    הסליפ פה זה מתודה שמרדימה את הטרד שעליו הקוד רץ, והיא תרדים אותו לשלוש שניות. זאת אומרת שהטרד הזה יהיה חופשי לעשות משימות אחרות במערכת הפעלה, הוא לא באמת הולך לנוח, אבל שוב פעם עניין של אימפלמנטציה.

  14. 03:56

    כעבור שלוש שניות החלטנו להדפיס Pump Can is Ready, אוקיי? עכשיו בואו ננסה לקרוא לפונקציה הזאת Grow Pump Can ונראה בעצם איך הדבר הזה מתנהל.

  15. 04:13

    אז אני אפתח את הויו קונטרולר בצד ימין ובואו נכתוב פה את השם של הפעולה גו פאמפקן ונריץ את זה. עכשיו מה שמעניין זה שהפונקציה הזאת מיד מיד מחזירה תשובה זאת אומרת אם אני עכשיו אעשה פה פרינט done מבחינת הויו קונטרולר אני אראה את הפרינט הזה קודם ורק אחרי שלוש שניות אני אראה את פאמפקן is ready בואו נבדוק את

  16. 04:40

    העניין. אוקיי, אז ה-view controller מבחינתו הוא סיים, הוא קרא לפונקציה והיא הסתיימה, היא החזירה מיד ערך, אוקיי, השליטה מיד חוזרת ל-UI-thread, ואחרי כמה זמן, אחרי שלוש שניות, אז הפעם כן שלנו is ready.

  17. 04:59

    טוב, נחמד. אבל אם אנחנו באמת רוצים לדווח תוצאה ואנחנו רוצים לעדכן UI, אז הכלל הבא שאתם צריכים ללמוד, יש לכם שתי כללים שאני רוצה להגיד.

  18. 05:14

    כלל אחד, אם יש לכם משימה שלוקחת הרבה זמן, אל תעשו אותה פה ל-UI-thread, אתם צריכים לעשות אותה באיזשהו דיספייץ' כלל מספר שתיים כשאתם מעדכנים את ה-UI אתם מעדכנים אותו אך ורק על המיין טרד אסור לכם לעשות את זה אחרת כדי לעבוד עם המיין טרד שוב פעם יש לנו קיו מתאים והקיו הזה זה דיספייץ' קיו מיין כאן אני יכול לתת משימות ל-UI טרד שיריץ אותן מתי שהוא

  19. 05:44

    יכול מתי שהוא מתפנה ושוב פעם אנחנו עובדים פה עם הסינק ועכשיו אנחנו בעצם יכולים לעדכן את ה-UI אז לפי הכלל השני את הפרינט סטייטמנט שלנו או סט טקסט על איזשהו לייבל וכן הלאה אנחנו עושים כאן בדיספאצ' קיו מיין אוקיי על הדיספאצ' קיו של ה-UI טרד וכאן בוא נגיד פאמפ קן איז רדי וככה בעצם אנחנו אמורים לעבוד בסדר אני מריץ משימה ברקע היא

  20. 05:54

    יכולה לקחת הרבה זמן ולכן היא חייבת להיות ברקע ואז אנחנו יכולים להדפיס את התוצאה או לשנות UI רק על ה-UI טרד אני מריץ וזה בעצם ההיכרות הראשונה שלנו פה עם GCD אוקיי עכשיו יש כמה dispatch cues שאתם צריכים להכיר אם אתם רוצים לבוא ולעבוד עם המערכת הזאת אז בואו נכיר אותה.

  21. 06:43

    בוא נגיד let q1 שווה dispatch q main סליחה dispatch q global עכשיו כמו שאתם רואים יש לנו פה עוד אופציה לתת פרמטר שנקרא quality of service אוקיי עכשיו quality of service יכול להיות אחד מהרשימה הבאה הרשימה הולכת ככה יש לנו את הuser is interactive אוקיי User Interactive זה בעצם פריוריטי של הטרד או של ה-Q יותר נכון של תור המשימות וזה הפריוריטי הגבוה ביותר.

  22. 07:18

    כלומר המשימות שאני נותן פה הן בדחיפות ממעלה ראשונה אם אני אתן ל-Q1 עכשיו משימה אז זה יהיה מאוד מאוד מאוד חשוב. יש לנו עוד אפשרות להגדיר תורים אחרים בוא נקרא רגע ל-Q הראשון User Interactive ואז נגדיר את ה-Q הבא User Initiated אוקיי ושוב פעם dispatch queue ו-global ואנחנו נותנים quality of service וכאן אנחנו נגיד פשוט

  23. 07:45

    user initiating טוב בואו נראה רגע דוקומנטציה לגבי ה-quality of service כדי שיהיה לכם את כל התמונה המלאה מתי להשתמש באיזשהו quality of service מסוים אז בואו נכתוב swift quality of service ונלך פה על הדוקומנטציה הרשמית של developer.apple.com ופה יש לנו בעצם את ה-quality of services את הרשימה שלהם הם

  24. 08:12

    הם מסודרים פה מהסדר של התור הכי חשוב ועד לתורים הכי פחות חשובים. אז היוזר אינטראקטיב זה ה-Q הכי חשוב, כאן אנחנו נרצה להריץ דברים שמעדכנים ממש UI, למשל אנימציות, טיפול באירועים או לעדכן את הממשק משתמש או דברים שממש ממש היוזר הפעיל והיוזר עכשיו מצפה מיד מיד לתגובה.

  25. 08:35

    ה-quality of service הבא זה user initiated. משימות מאוד חשובות, בסדר? ממעלה שנייה מה שנקרא, היוזר מצפה לתשובה, ובינתיים הוא לא יכול להמשיך לעבוד.

  26. 08:46

    יש לנו את ה-Default Quality of Service שהוא פשוט מתחת לשתי אלה, אוקיי? זה מה שגם כתוב בדוקומנטציה. אז בואו נקרא כאן, Default Task זה פחות חשוב מ-User Initiated ו-User Interactive, אבל יותר חשוב מ-Utility ו-Background, הוא נמצא ביניהם כמו שאמרתי, ואנחנו ניתן את ה-Q הזה, את הקלאס הזה ל-Q, אם אנחנו רוצים לעשות משימות בעבור המשתמש

  27. 09:11

    שהמשתמש התחיל והן קצת פחות חשובות. ה-quality of service הבא זה utility. כאן אנחנו נציג משימות, המשימות שאנחנו נעבוד איתן כאן הן יהיו משימות שלוקחות יחסית הרבה זמן אבל עדיין היוזר מודע אליהן והיוזר רוצה

לקורס המלא: קורס פיתוח אפליקציות לאייפון

ההרצאה הקודמת: דוגמאות לעבודה עם JSON - חלק 3

ההרצאה הבאה: הורדת תמונות מהאינטרנט ב-Xcode

הרצאות קשורות מקורסים אחרים

  • ביטול משימה אסינכרונית
  • עבודה עם VI - חלק 1
  • קריאה וכתיבה אסינכרונית לקובץ ב-NodeJS
  • איך נראת עבודה אמיתית

קורסים נוספים במסלול

  • קורס יסודות התכנות - שפת JAVA - קורס ג'אווה למתחילים
  • קורס פיתוח אפליקציות - לאנדרואיד - Android - ב-JAVA
  • קורס פלאטר - Flutter - שפת DART של גוגל למובייל - פיתוח אפליקציות לאנדרואיד ואייפון
  • קורס PhoneGap - פיתוח אפליקציות לאנדרואיד ואייפון