
setValue על ילד ששמו ה-id של החדר, ועם completion block שמדווח על שגיאה או הצלחה.putData, ורק אחרי הצלחה שומרים את שם הקובץ ב-imageURL ואת כל המילון במסד.observe לאירוע child added. מכל snapshot מקבלים מילון, יוצרים ממנו ChatRoom, מוסיפים למערך ומעדכנים את הטבלה עם insertRows. ב-deinit מסירים את המאזינים.UUID().uuidString ליצירת מזהה ייחודי.image.jpegData עם compression quality, למשל 0.8, או 1 לאיכות מקסימלית.setValue לשמירה, observe לקריאה ו-removeAllObservers בעת סגירת המסך.putData וגם setValue מחזירים שגיאה אופציונלית ב-closure, ובתוך ה-closure צריך לכתוב self במפורש.הטקסט המלא של הדקות הראשונות בהרצאה «שמירת מידע בדטה-בייס בענן - Firebase Database» בקורס הווידאו של PracticU – כתוביות בעברית עם זמן התחלה לכל פסקה. כך תוכלו לקרוא ולחפש את הנושאים לפני שמתחילים ללמוד.
שלום וברוכים הבאים, בשיעור הקודם למדנו איך לעשות התחברות והרשמה והיום אנחנו רוצים ללמוד איך לשמור מידע ולאחזר אותו בפיירבייס סטאטאבייס ולא רק מידע אלא גם תמונות וקבצים עכשיו אנחנו מסתכלים פה בסימולטור על מה שאנחנו רוצים לעשות בפרויקט, עדיין לא מימשנו את זה אז אני יודע שאין
לכם עדיין את התמונות האלה וכן הלאה מה שאנחנו נרצה לעשות, צ'אט רומס זה הטייבל ויו קונטרולר אז אנחנו נרצה לאכלס אותו במידע שטענו מענן ובנוסף אנחנו נרצה בלחיצה על כפתור הוספה ליצור בעצם דאטה פה בטבלה, אוקיי למה אני מתכוון
שאם אני נגיד מייצר עכשיו חדר חדר חדש נגיד נכתב כאן חדר חדש ואני אצלם פה איזושהי תמונה מהאלבום או מהמצלמה דרך אגב אני אוכל לבחור את התמונה להקטין אותה או להגדיל ואז לעשות choose אז זה החדר בעצם נתנו לו תמונה ונתנו לו כותרת ואז אם אני נלחץ פה על create room אני ארצה להציג דיאלוג
למשתמש שימתין מעט וברגע שהפעולה הסתיימה אז אנחנו בעצם חוזרים לטבלה ומציגים את החדר החדש שזה עתה יצרנו כשהתמונה יורדת כבר מהענן וכל הדאטה הזה כאמור נשלח מהענן אוקיי אז זה בעצם מה שאנחנו רוצים לעשות בסרטון הנוכחי כדי להתחיל אנחנו בעצם רואים שיש לנו פה את
הכפתור פלוס והוא מוביל אותנו לview controller של יצירת חדר אז בואו ניגש ליצירה של עוד view-controller נוסף.
אנחנו נעשה פה פלוס view-controller וזה בעצם יהיה create-room-view-controller. אנחנו נשייך פה segue של show אז גרנטי-קונטרול-דראג-segue ואנחנו נעשה פה show-segue רגיל.
זה בעצם יהיה המקום שבו אנחנו נייצר חדר חדש ובואו נשייך לזה את הקלאס, יש לנו כבר קלאס שיצרנו בשביל זה, אז נעמוד פה על ה-view-controller עצמו ונלך ל-identity-inspector ונשייך את הקלאס של Create Room View Controller שיוצרנו.
עכשיו מבחינת UI אנחנו נרצה להוסיף פער באתרן אייטם עבור הכפתור של לצלם תמונה, אז אנחנו מחפשים בפלוס פער באתרן אייטם, והולכים פה בצד ימין ומוסיפים אייטם, לעמוד על התכונות ונשנה את הסוג של הכפתור לכפתור של מצלמה, אז למטה יותר יש לנו כמה, יפה.
מעבר לזה אנחנו רוצים בעצם טקסט פילד וכפתור, אז בואו נוסיף טקסט פילד. אפשר לשים אותו בסטאק כדי לחסוך מעט באילוצים אז אני מכניס אותו לתוך סטאק v אנכי ובנוסף אנחנו רוצים גם כפתור אז בטון וגם את הכפתור אנחנו רוצים להכניס לתוך הסטאק האנכי אוקיי עכשיו בכפתור בואו נרשום פה create room בטקסט של הכפתור ונגדיל פה את
הטקסט של הכפתור בצורה משמעותית נגיד בוא נעשה גודל של טקסט של 40 אוקיי עכשיו מבחינת אילוצים של כל הסטאק v אנחנו נתפוס פה את הסטאק v בצד שמאל את כל הסטאק v עצמו והאילוצים הם יהיו אילוצים סטנדרטיים 16, 16 ו-16.
עכשיו מתחת לכל הדבר הזה אנחנו רוצים תמונה במקרה שהמשתמש שלנו בחר תמונה. כאן אנחנו ניתן placeholder של title של החדר, ומתחת לזה כל המקום שנשאר אנחנו נשים ב-image view שבו נציג את התמונה שהמשתמש בחר.
אז פלוס image view ונוסיף לכאן image view. ומבחינת אילוצים אנחנו נרצה שהתמונה תקרא את כל מה שנשאר עם איזה שהם שוליים של 16 מכל הכיוונים, יפה.
אז זה בעצם ה-View Controller של Create Room מבחינת UI, בואו נחבר Outlets וכן הלאה ונראה איך אנחנו יכולים אחר כך באמת למלא שם צדוק. כרגע נוציא Outlets, אז אני אעמוד פה על נגיד טקסט פילד, נפתח את ה-סיסטמנט אדיטור, נפתח לי כבר ב-Chat Room View Control, ב-Create Room View Controller, מצוין, אז אני רוצה להוציא אקשן לכפתור,
נקרא לזה Take Photo, טייט רצוי שהוא יהיה UI בטון, כבר בטון אייטל וקונקט. מבחינת הטקסט פילד אז נוציא Outlet, נקרא לזה Title טקסט פילד ומבחינת הכפתור אז יש לנו אקשן של קריאייט רום, נוריד את זה גם לפה קריאייט רום, שוב פעם הטיפוס רצוי שהוא יהיה UI בטון ומה עוד יש לנו את ה-Image View של התמונה,
אז נוציא Outlet ל-Image View של התמונה, נקרא לזה Room Image View טוב אז עכשיו בעצם כשהוצאנו האוטלטים כרגיל לטקסט פילד ולאימג' ויו ויוצאנו אקשנים לכפתור ולברבטון אייטם, נשאלת השאלה איך אנחנו יכולים עכשיו לייצר בעצם מודל שלנו ולשמור אותו
לפיירבייס דאטאבייס אז בואו נקפוץ רגע לדוקומנטציה נפתח שנייה דפדפה וניכנס לדוקומנטציה של פיירבייס שוב פעם מזכיר לכם אם אתם לא זוכרים אז firebase.google.com כאן אנחנו הולכים בגטינג סטארטד בדוקומנטציה ונלך לגו טו דוקס וכאן בגטינג סטארטד פור
איי-או-אס אתם יכולים למצוא את כל מה שאתם מתעניינים בו והפעם אנחנו מתעניינים ברילטיים דאטאבייס וברילטיים דאטאבייס באיי-או-אס כמובן וגטינג סטארטד או בוא נלך פה ל-read and dry data כי אנחנו נעבור ביחד את השלבים של גטינג סטארטד ב-read and dry data אומרים לנו בעצם אתם רוצים רפרנס לדאטאבייס אז אז
database.database.reference זה גישה לדאטאבייס, לאובייקט של הדאטאבייס. עכשיו, מעבר לגישה לאובייקט של הדאטאבייס, מה אנחנו רוצים לשמור? מה אנחנו יכולים לשמור?
אנחנו יכולים לשמור או סטרינגים או מספרים או dictionaries או arrays, אוקיי? אנחנו לא יכולים לשמור איזה אובייקט שאנחנו רוצים, אלא אם כן נמיר אותו להיות כדיקשנרי או כ-array.
במילים אחרות, אם אנחנו רוצים לשמור משהו בדאטאבייס זה צריך להיות דיקשנרי של סטרינג וכל טיפוס אחר שהוא נגיד סטרינג מספר בוליאן וכן הלאה אני אותו דבר אם אנחנו רוצים לשלוף מידע אז גם כשאנחנו נשלוף מידע אנחנו בעצם נקבל את המידע שלנו כדיקשנרי של סטרינג ואני אז כל מודל שאנחנו רוצים בעצם
לייצר אומרים לנו כאן אתה צריך לייצר אותו מדיקשנרי או לשמור אותו כדיקשנרי בואו נייצר מודל לדוגמה ונראה איך אנחנו יכולים להפוך אותו לדיקשנרי ולייצר מופע שלו מתקשורת.
אחת אנחנו חזרה ל-Xcode, הבנו את הרעיון הכללי. אנחנו נרצה לייצר בפרויקט שלנו גרופ חדש לכל המודלים, אז תחת הגרופ של ה-FileChat אנחנו נעשה New Group חדש, נקרא לזה Models, ותחת מודלים אנחנו נרצה לייצר אצלנו מודל של ChatRoom, אז New File,
Swift File, ונקרא לזה ChatRoom.swift. עכשיו, אנחנו באיזשהו שלב אנחנו נרצה לעבוד פה גם עם אימג'ים וכן הלאה אבל בואו נשנה פה את האימפורט ל...
בוא נגיד UIKit אנחנו נרצה לייצר קלאס עבור המודל זה יהיה לנו יותר נוח בגלל שקלאסים ניתנים לשינוי ולעדכון בעצם בכל מקום באפליקציה אז אני מייצר פה קלאס עכשיו מבחינת ChatRoom על פרופרטיס התכונות שאנחנו רוצים תכונות רגילות יהיה לנו ID הוא יהיה סטרינג תמיד כשאנחנו שומרים דברים בדאטאבייס אנחנו נרצה שיהיה להם ID כדי שנוכל לזהות אותם לחדר יש טייטל אז הטייטל יהיה סטרינג,
לחדר יש אונר מי יצר אותו מהיוזר איידי של האונר, לחדר יהיה לנו גם את האונר name כדי שיהיה לנו קל לזהות במקום לקבל רק איידי אנחנו נרצה גם איך קוראים לבעל החדר, מעבר לזה אנחנו נרצה תאריך יצירה אז created add הוא יהיה date ויהיה לנו משתנה אופציונלי של אימאג' קישור לתמונה זה יהיה סטרינג אבל הוא יהיה
אופציונל. עכשיו בגלל שיצרנו קלאס אז אנחנו צריכים בניין, אנחנו נייצר בנאי רגיל כמו בכל קלאס רגיל אז יש לנו את ה-id אנחנו לא צריכים תכף אני אראה לכם מה אנחנו עושים איתו, יהיה לנו את ה-title אבל את ה-honor-id שהוא string ויהיה לנו את ה-honor-name שהוא גם כן string.
לגבי ה-id של החדר אנחנו פשוט נייצר id חדש, id יהיה שווה ל-uuid חדש שזה Universal Unique Identifier בעצם אני נותן לסוויפט להמציא לי איזשהו id יוניקי לגמרי לחדר אנחנו עושים את זה על ידי יצירת מופע של uuid ואנחנו רוצים את ה-uuid-string אז הנה יש לנו ID לחדר וזה Unique Identifier לכל מופע יהיה מזהה ייחודי לגמרי משל
עצמו. מעבר לזה אז ה-Title זה לא בעיה: Self.Title שווה ל-Title, Self.HonorID שווה ל-HonorID ו-Self.HonorName אותו סיפור.
עכשיו מה לגבי התאריך יצירה? ה-CreatedEd פשוט התאריך של עכשיו, נכון? כרגע יצרנו את המופע אז בעצם אנחנו מייחסים את זה לתאריך ההתחלה והתחלנו את השדות שלנו, אם הג'יורל אנחנו לא יכולים להתחיל בשלב הזה כי אנחנו צריכים קודם כל להעלות תמונה וכן הלאה.
אז בוודאי רגיל למודל שלנו, אולי מעניין פה הקטע עם ה-unique identifier לחדר, אז הוספנו פה את העניין הזה. עכשיו, מה לגבי Firebase? Firebase בעצם רוצה מאיתנו שנהיה מסוגלים להפוך Chat Room לדיקשנרי ובחזרה.
במילים אחרות אנחנו נרצה איזשהו דיקשנרי מטיפוס של דיקשנרי של סטרינג בני, ואנחנו נרצה שזה יהיה תכונה מחושבת, אוקיי?
הדיקשנרי שלנו יהיה מילון, ובמילון אנחנו נשים את כל התכונות ID יהיה שווה לself.id Title self.title רק את זה צריך לשים כמובן במרכאות אוקיי אנחנו בונים Dictionary וככה אנחנו בעצם יכולים לעשות סיריליזציה Owner ID ונשים פה את ה-Owner ID ו-Owner Name אותו סיפור עכשיו בסוף אנחנו נרצה גם
להחזיר את ה-Dictionary הזה אז אנחנו עושים Return דבר אחרון פה באמצע יש לנו גם את ה-Created Add וה-Created Add צריך לחשוב איך לוקחים Date to String ויש לנו את ה-OptionalImage אז לגבי ה-OptionalImage אנחנו נגיד אם יש תמונה אז נשמור אותה בדיקשנר
E-flat-imageURL שווה ל-imageURL שלנו רק אז אנחנו רוצים להוסיף אותה למילון אז dictionary במקום ה-imageURL שווה ל-imageURL אוקיי מה לגבי המרה של דייט לסטרינג כאן אנחנו נרצה להשתמש באיזשהו דייט פורמטר אנחנו נשתמש ב-ISO 8601 פורמטר בצורה הבאה let formatter שווה ל-ISO 8601 date formatter חדש
ועל הפורמטר אנחנו נרצה לבחור ב-options בפורמט אופצ'יינס של אינטרנט טיים ובנוסף אנחנו רוצים שהוא יכלול לחלקי שנייה אז with fractional second אוקיי אז הנה יש לנו את הפורמטר ובעזרת הפורמטר כמובן שאפשר להמיר תאריכים לסטרינגים אז פורמטר נקודה דייט פרום סטרינג וסטרינג פרום דייט במקרה שלנו סטרינג פרום דייט
וזה הקריאייטד דייט וזה יהיה שווה לדייט סטרינג ואותו אנחנו נרצה להכניס לתוך הקריאייטד דייט אז כאן אנחנו יכולים להגיד דיקשנרי במקום הקריאייטד דייט שווה לדייט סטרינג ונעתיק מפה את השם של קריאייטד דייט כדי שנהיה מסונכרנים עם הזמנים אז עד כאן בעצם ראינו איך אנחנו יכולים לקחת אובייקט
רגיל ולהפוך אותו להיות דיקשונרי אוקיי בעצם לעשות לו סריאליזציה לדיקשונרי שזה הדרישה הראשונה של פיירבייס מאיתנו. סריאליז our object to dictionary וזה הנדרש על ידי פיירבייס אוקיי פיירבייס רוצה שאנחנו נשמור את הדברים שלנו כדיקשונרי עכשיו אנחנו צריכים גם להיות מסוגלים לעשות את התהליך ההפוך מה שעשינו פה נועד לשמירת מידע
אני שומר דיקשונרי אבל מה קורה אם אנחנו רוצים עכשיו לטעון את המידע שלנו בחזרה אנחנו נרצה לעשות לעצמנו גם בנאי שיקבל דיקשנרי ויפרק אותו לכל השדות של המחלקה אז בוא נעשה בנאי שיקבל דיקשנרי שטיפוס שלו זה דיקשנרי של סטרינג ועיני ובעזרת הדיקשנרי הזה אנחנו נרצה פשוט לפרק את כל מה שאנחנו צריכים אז בוא נעשה איזשהו גארד
גדול כזה עכשיו העינית הזה הוא פיילאבל זאת אומרת שהוא יכול להחזיר ניל במידה והדיקשנרי שהגיע הוא לא תקין אז אנחנו נעשה את זה פיילאבל עינית בצורה הזאת ועכשיו אנחנו נמשיך את הגארד לט הגדול שלנו.
אז גארד let ID שווה לדיקשנרי במקום ה-ID, let Title שווה דיקשנרי במקום ה-Title,