PracticU

עבודה עם Callbacks עבור משימות אסינכרוניות

בלי כתוביותעם כתוביות
PracticU › קורס פיתוח אפליקציות - לאייפון iPhone iOS - ב-Swift-Xcode › עבודה עם Callbacks עבור משימות אסינכרוניות
מילון מושגים:
View - רכיב שאחראי על הצגת המידע למשתמש (התצוגה) בדפוס MVC. גם טבלה וירטואלית מבוססת שאילתה במסד נתונים.
קונטרולר - רכיב שמתווך בין הממשק לבין הלוגיקה והנתונים, מקבל בקשות ומחליט כיצד לטפל בהן (למשל בדפוס MVC).
אסינכרוני - אופן פעולה שבו פעולה ארוכה רצה ברקע והתוכנית ממשיכה בלי להמתין לה, ומטופלת כשתסתיים.
Callback - פונקציה שמועברת כארגומנט לפונקציה אחרת כדי שתופעל מאוחר יותר, לרוב בסיום פעולה.
MVC - דפוס ארכיטקטורה שמפריד יישום לשלושה חלקים: מודל (נתונים), תצוגה (View) ובקר (Controller).
מודל - רכיב שמייצג את הנתונים ואת הלוגיקה העסקית באפליקציה. גם ייצוג מופשט של מערכת או תהליך.
JSON - פורמט טקסט קריא לייצוג נתונים מובְנים כזוגות מפתח-ערך, נפוץ להחלפת מידע בין שרת ללקוח.
URL - הכתובת שמזהה משאב באינטרנט, למשל דף אתר, וכוללת פרוטוקול, שם מארח ונתיב.

עבודה עם Callbacks עבור משימות אסינכרוניות
כדי להפריד את הקוד של הנתונים וההורדה מה-View Controller, צריך לדעת איך פונקציה אסינכרונית מחזירה תשובה. הפתרון הוא callback, פונקציה שמועברת כפרמטר ומופעלת כשהעבודה מסתיימת.
רקע: ארכיטקטורת MVC
ה-View Controller אחראי על הצגת הממשק ותגובה לאירועים. המודל מחזיק את הנתונים, הגישה אליהם והלוגיקה של הרשת. בשיעור מעבירים את העבודה מהשיעור הקודם לקלאס נפרד.
השלבים העיקריים
1. קלאס ImagesDataSource: קלאס ולא struct, כי לרוב רוצים אובייקט משותף שמועבר ב-reference. מעבירים אליו את ה-JSON ואת ה-struct בשם MyImage.
2. lazy var: jsonData מוגדר כ-lazy עם closure שמפעיל את עצמו. הוא נוצר רק בשימוש הראשון ונשמר אחר כך. computed property רגיל היה ממיר את המחרוזת בכל גישה מחדש.
3. getImages: מחזירה מערך של MyImage, או מערך ריק אם המידע חסר.
4. getImage עם callback: מקבלת URL ופרמטר שני, closure שמקבל UIImage?. הפונקציה עובדת ברקע ב-DispatchQueue.global, ובסיום מפעילה את ה-callback בתוך DispatchQueue.main.async.
5. @escaping: נדרש כי ה-closure מועבר הלאה לפונקציות אחרות ומופעל אחרי שה-getImage כבר חזרה. בתוך הבלוק צריך לכתוב self במפורש.
6. שימוש ב-View Controller: יוצרים ImagesDataSource, מקבלים את התמונות, ולכל אחת קוראים ל-getImage ומעבירים closure. בתוכו נוצר ה-UIImageView ונוסף ל-stack view.
7. typealias: אפשר להגדיר ImageCallback ולהשתמש בו במקום לכתוב את הטיפוס כל פעם, ולהוסיף לו תיעוד.
איך זה עובד
הקורא לא ממתין לתשובה. הוא קורא לפונקציה, וה-View Controller ממשיך בעבודתו. כשהתמונה מגיעה, ה-closure שהועבר כפרמטר מופעל ומקבל אותה. המרצה משווה את זה לדפוס observer או listener משפות אחרות.
שימו לב
המרצה מציין שהנושא קשה להפנמה ושכדאי לעבור עליו שוב. הוא גם מזכיר, בלי לפרט, שאפשר להעביר self כ-weak reference.
אחרי השיעור אפשר לכתוב פונקציה אסינכרונית בקלאס נפרד ולהחזיר ממנה תוצאה לקורא דרך callback.
השיעור הבא בקורס: סמפור ונעילות - Locks and Semaphores

פרקי ההרצאה: עבודה עם Callbacks עבור משימות אסינכרוניות

  1. 00:00

    הוצאת הקוד מה-View Controller

  2. 00:37

    הסבר על ארכיטקטורת MVC

  3. 01:53

    יצירת מחלקת ImagesDataSource

  4. 03:33

    פונקציה שמפעילה את עצמה ו-lazy var

  5. 05:26

    lazy var לעומת תכונה מחושבת

  6. 06:17

    פונקציה getImages שמחזירה מערך

  7. 08:32

    מה הם Callbacks

  8. 09:05

    פונקציה עם callback לתמונה

תמלול ההרצאה: עבודה עם Callbacks עבור משימות אסינכרוניות

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

  1. 00:02

    שלום וברוכים הבאים, בשיעור הקודם למדנו איך לכתוב קוד שיכול לעזור לנו להוריד תמונות מהאינטרנט אבל בנינו את הפרויקט בצורה כזאת שכל העבודה נעשתה ב-view controller הסיבה שבנינו את זה ככה היא שעוד לא למדנו על עבודה עם callbacks וזה בדיוק הנושא של היום ככה אנחנו נוכל לעבוד בצורה מסודרת עם ארכיטקטורה

  2. 00:22

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

  3. 00:37

    כדי להגיע למצב הזה שהארכיטקטורה הזאת מכונה MVC, סדר מודל view controller, מודל view controller אומר, אתם רוצים להפריד את המודלים מה-view controller מה-view, אוקיי? כלומר, אם זה view וזה קונטרולר, אז יש לכם גם את המודל.

  4. 00:58

    במודלים אתם מכניסים כל מיני שכבות שלכם, דאטה, דאטה, access logic, network logic, כל מה שאתם רוצים, המון המון קלאסים, פרקטים, מה שתרצו.

  5. 01:08

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

  6. 01:19

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

  7. 01:33

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

  8. 01:47

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

  9. 01:59

    לצורך ההדגמה בואו נייצר קובץ חדש swift-file ובואו נקרא לזה images data source אוקיי עכשיו בגלל שאני רוצה לעבוד פה עם ui-image אז בסופו של דבר אנחנו נצטרך פה import ל-ui-kit בואו נעשה את זה כבר עכשיו יהיה לנו קלאס של data source אמרנו images data source אז בואו נקרא לזה ככה אנחנו לא

  10. 02:29

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

  11. 02:47

    אז יש לנו את זה, זה ה-JSON שלנו, נכון? אז בואו ניקח אותו רגע, בלי כל היתר, ובואו נעשה לעצמנו let json שווה, ונדביק את מה שהיה לנו שם קודם. לא יודע איך, יש לי פה עוד סוגר אחד, אני אוריד אותו, וזה בסדר. אז זה ה-JSON, אוקיי?

  12. 03:10

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

  13. 03:19

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

  14. 03:48

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

  15. 04:01

    עכשיו, אנחנו לא רוצים שזה יהיה סתם let, אנחנו רוצים שזה יהיה משתנה lazy var. מה זה lazy var? זה משתנה שניתן יותר מאוחר. מה זה יותר מאוחר? כשמתינים את הקלאס הזה, עדיין אין JSON data.

  16. 04:15

    ברגע שמשתמשים במשתנה הזה פעם ראשונה, הוא יתאם. בואו נעשה רגע את העבודה פה. בואו נעשה return ל-JSON שלנו מלמעלה, נקודה data using utf-8 אוקיי עכשיו זה אופציונל נכון אז בוא נגיד שזה אופציונל פנטסטי שוב פעם lazy variable lazy variable הוא משתנה שלא נטען מיד כשמייצרים את המופע של הקלאס מישהו יעשה עכשיו new ל-image data source

  17. 04:49

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

  18. 05:06

    דבר שני, יש לנו פה פונקציה שהיא מפעילה את עצמה, וברגע שהפונקציה מופעלת, Swift תקרא לפונקציה כדי להפעיל אותה ברגע שאני אשתמש ב-JSONData, והיא תתחיל את המשתנה הזה יותר מאוחר, בסדר?

  19. 05:18

    אז LazyLoadedVariable. אוקיי, אתם לא חייבים להשתמש פה דרך אגב ב-LazyVar, אתם יכולים לעשות תכונה מחושבת. הבעיה שאם אתם תעשו תכונה מחושבת, בואו אני אדגים מה זה תכונה מחושבת, כמו שאתם בטח מכירים, אבל נעשה.

  20. 05:35

    אם הייתי אומר var data, בסדר, וכאן הייתי אומר שזה מסוג של data, נכון? כמו תכונה מחושבת, אופציונל, וכאן הייתי אומר return json.data using utf-8, זאת computed property.

  21. 05:56

    מה הבעיה? שכל פעם הוא הולך ל-Json הזה, ממיר לכם אותו ל-data, הולך ל-Json, ממיר ל-data, הולך ל-Json, ממיר ל-data.

  22. 06:03

    Lazy Variable הוא לא כזה, למרות שהסינטקס פה הוא כמעט אותו דבר, נכון? אבל Lazy Variable הוא הרבה יותר חכם. הוא לא מתחיל את זה בכלל עד שאתם לא משתמשים, בדומה למה שקורה ב-computed property, אבל once הוא התחיל את זה פעם אחת, הוא שומר את זה כתכונה שמורה, ואז לא מחשבים את זה כל פעם, אוקיי?

  23. 06:21

    אז מומלץ פה להשתמש ב-Lazy Variable, זה נחמד, אז השתמשתי. הלאה. אמרנו, רוצים את התמונות ב-View Controller, אז כדי לקבל את התמונות אין בעיה, אנחנו נעשה פשוט פונקציה, get images, תכף נמשיך, אנחנו פשוט ניקח את ה-struct מכאן כדי שהוא

  24. 06:43

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

  25. 07:06

    אז כדי לקבל את התמונות, אין בעיה, אני מחזיר מערך של my image, אנחנו נעשה את אותו guard led שהיה לנו קודם, בסדר?

  26. 07:18

    אחרת אני מחזיר מערך ריק עכשיו הדאטה צריך לבדוק שהוא אכן קיים אז בוא נעשה guard let data שווה ל json data מלמעלה אלס נחזיר מערך ריק או יודעים מה בואו נאחד את זה עם ה-guard let הנוכחי כבר באופן הבא אז אני בודק שיש דאטה ואז התמונות תילקחנה מהדאטה הזה אחרת אני מחזיר פה מערך ריק ואם יש לנו תמונות ויש לנו דאטה אז אנחנו יכולים להחזיר את התמונות אוקיי הפונקציה הזאת כתובה get images

  27. 08:08

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

  28. 08:26

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

  29. 08:35

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

  30. 08:52

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

  31. 09:11

    איך זה עובד? אנחנו בעצם מגדירים closure בצורה הבאה בואו נעשה פה פונקציה נגיד get image שהיא תיתן לנו url אבל תיתן לנו פה עוד פרמטר שזה ה callback על זה אנחנו רוצים לדבר ה callback הוא בעצם פונקציה אז בואו נכתוב פה משהו שדומה לפונקציה שתקבל תמונה היא תקבל נגיד ui image אוקיי אוקיי כתבתי את הפונקציה הזאת זאת פונקציה סינכרונית

  32. 09:44

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

  33. 10:06

    אנחנו נעשה guard let data שווה ל json data מלמעלה בסדר אלס אני לא ממשיך

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

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

ההרצאה הבאה: סמפור ונעילות - Locks and Semaphores

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

  • משימות מתוזמנות - crontab
  • משימות של מנהל צוות הבדיקות
  • יצירת עמוד עבור המוצר
  • העלאת הרשאות בלינוקס על ידי ניצול של משימות מתוזמנות - crontab

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

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