[ SWIFT ] - 史丹福 StandFord-CS193P-課程16-心得分享-20150928

[ SWIFT ] - 史丹福 StandFord-CS193P-課程16-心得分享-20150928
課程重點:Persistence 將資料儲存在設備上,課程中將介紹4種資料儲存方式如下:


前言
在此之前已有簡單的方式可以將資料儲存在設備上,NSUserDefaults:針對簡單的小量的數據儲存,一種儲存一個物件在磁碟上的方式,而且被儲存的對象不需要有所有屬性的目錄,所以不需要陣列(array)、字典(Dictionary)或資料等類型,因為他們都可以使用NSUserDefaults來儲存,但當需要更靈活或儲存更大量的資料時,就需要使用Archiving的方法!

 Persistence 將資料儲存在設備上,課程中將介紹4種資料儲存方式如下:

(1)Archiving
說明:只要物件實現了Archiving的兩個方法,那麼使用Archiving的兩個方法,就可以儲存此物件的所有分支屬性 。

Archiving的兩個方法-encodeWithCoder & init:
說明:encodeWithCoder函數和一個用來讀取他們自身的 init 方法,因此encodeWithCoder就是以字典方式將物件自身寫出來,然後再進行編碼,當這些物件需要被讀取時,init方法會初始化他們,從字典中讀取物件的屬性。
例如:
storyboard 就是用這種方式儲存的,所有的UIView、UIViewController、button等都是可以編碼的,首先他們實現NSCoding 協議,然後這些物件都被寫入字典中,因此當你儲存storyboard時,整個view中的圖表、按鈕等所有物件都會以Archiving機制方式被儲存於字典中記錄下來。


(2)SQLite
將所有數據寫入一個sql db,但很可能不會直接獲取這個db,程式中與SQLite連接的API類似C語言API但在使用上可能會有困難,因為Swift沒有 C語言的指針進入內存的概念。


(3)File System:檔案系統
3.1只要是iOS系統的設備都有一個基於Unix的檔案系統,需要4個步驟來實現操作:
步驟:
Step1-需要根目錄的檔案路徑,此路徑指的是基於檔案系統的URL不是類似HTTP請求的URL
Step2-如果需要在路徑下創建資料夾需使用Append方式將路徑轉換為URL形式
Step3-透過此URL讀取或寫入這個文件
Step4-透過NSFileManager來管理文件,包含重新命名、查看檔案形式等

3.2從根目錄(/)開始此為一個保護的檔案系統,因此在根目錄下的大部分東西
是看不到的,例如:系統目錄

3.3有一部分是 App所擁有的資料夾,稱為沙盒( sandbox)是唯一可以寫入的地方,即使在沙盒中有些位置你也不允許寫入,例如:存放App本身的位置,但是你可以讀取沙盒中所有的目錄。

透過NSData來讀取或寫入檔案內容:
 
3.4為何需要沙盒
基於安全性,例如:不能讓別人看到App運作的方式,產生哪些檔案等等,因此不能查看系統目錄,以免造成iphone異常。
另一個原因是當使用者要刪除App時只需要刪除沙盒即可。

3.5沙盒中有什麼?
有各種包(bundle)已目錄形式存在,所有App中會用到的資源都在裡面,Application bundle :App的實體
※沙盒中的 bound內容都是唯讀的。
當你想要在裡面放置一些需要編輯的東西時,例如:db文件 或  資料檔案,必須把它從應用包裡複製出來放到沙合理的另一個子目錄中,然後再至子目錄中編輯他!
這樣就能帶著你的App和將要修改的部份一同發佈了。

3.9其他目錄:
Documents 目錄:存放用戶資料的地方
Cashes目錄:存放可以被丟棄資料的地方,例如:從網路上下載的資料,在此目錄中的資料不會被備份到ituns中。
使用NSSearchPathDirectory可以搜尋所有目錄。

3.10如何獲得一個指向沙合得URL
使用檔案管理得類(file manager class):NSFileManager中的DefaultFileManager會返回默認的NSFileManager
※NSFileManager是線程安全,在許多情況下可能會有不同線程讀寫同一個大文件的情況,條件是一個NSFileManager只在創建他的線程使用,換句話說:不應該在一個線程裡創建NSFileManager,然後再另一個線程中使用他(這就不再是線程安全了)。
※DefaultFileManager在主線程中,否則創建一個NSFileManager。

有了NSFileManager,可以給他發送消息URLsForDirectory會返回一個Array陣列,裡面包含所有檔案目錄和caches directories緩存目錄,以及所有的應用目錄,此陣列中包含用戶檔案歷史、電腦區域網路、網際網路信息等,此陣列中第一個參數是NSSearchPathDirectory。
如何建置一個系統路徑-透過NSURL
URLByAppendingPathComponent :取的建置檔案的路徑
URLByAppendingPathExtension:例如:.jpg

查詢URL是在本地磁碟或網路上:isFileURL
resourceValuesForKeys:用於存取這個文件最後的訪問時間,也可以獲取以byte為單位,文件的大小信息。
NSData-如何把一些內容寫入檔案系統
使用NSData,透過 func writeToURL寫入,其中參數atomically 指先寫一個臨時文件然後刪除老的文件,再將新的臨時文件移過去,整個過程保持原子級,以確保文件不會是半成品(永遠都是完整的寫入文件),回傳Bool表示是否操作成功。
其他檔案系統中可以做的事:修改檔案,創建目錄。

(4)Core Data
一個完全物件導向的方式將資料存入SQL DB的方法,擁有強大的查詢功能。

以下為建置方式:

Core Data相關名稱:
表結構:NSEntityDescription (實體描述)
表記錄:NSManagedObject (受托管的物件)
資料庫存取:NSPersistentStoreCoordinator (檔案儲存協調器)
資料庫操作:NSManagedObjectContext (受托管的物件文本)

資料庫與Core Data的名稱對應:
資料表 (Table) = 實體 (Entity)
欄位 (Field) = 屬性 (Attribute)
表格間的關聯 v= 關係 (Relationship)

Managed Object Context這類別記載了我們的App在記憶體中所有的Entity,當你要求Core Data載入物件時,你必須先向Managed Object Context提出要求。

假如Entity不存在記憶體中的話,Managed Object Context會向Persistent Store Coordinator發出請求,試著嘗試尋找它。

Persistent Store Coordinator的任務是追蹤Persistent Object Store,而Persistent Object Store實際知道如何讀寫資料。

Managed Object Model則是用來處理資料,這些元件都知道要如何處理資料。
Core Data非常擅長和Table View合作,NSFetchedResultsController:給一個查詢請求,然後關連一個tableView之後tableView會永遠顯示查詢結果,即使改變table內容他也會自動更新(包括新增欄位等)





Embed Segues
Embed Segues:將一個view放到另一個MVC的view裡(將一個MVC內崁到另一個 MVC)
處理該segue的方法與其他segue沒有區別,但是有一點是必須注意的,在prepareForSegue的時候,嵌入的MVC的outlet是沒有初始化的,所以不要訪問outlet的屬性。
用法如下:
 (1)拖入一個Container View
※ 注意拖入時需讓Container View在最上層!
  (2)建立Embed Segues

 

 

留言

熱門文章