Objective-C 14.NScoding

什麼是NScoding
實作NScoding
NScode常見用途
相關閱讀

本文
什麼是NScoding
NScoding是cocoa/cocoa Touch Framework中序列化(Serialization)的實作。
就是「物件變檔案,檔案變物件」。
開發Mac OS X和iOS App 如果不懂NSCoding,就等同寫javascript卻不懂什麼是json。

cocoa/cocoa framework中,當然可以讀取json格式。
但更常用PList及NSCoding。

PList:
有許多種格式,文字或binary格式。

NSCoding:
可以把各種不同的物件,轉換成NSData。

實作NScoding
NScoding是一個protocol,只有二個method要實作

encodeWithCoder:
 將物件透過NSCoder轉成NSData。
initWithCoder:
 將NSData轉成物件。

例子:
KKSongTrack的class物件,代表一首歌。

以下為實作:
因為property都是NSString,都是objective-C物件,所以選擇encodeObject:forKey和encodeObjectForKey:

除了Objective-C物件型別,NSCoder還處理BOOL,整數,浮點數相關method可用。

下圖為把歌曲轉成NSData:

下圖把NSData再轉回KKSongTrack物件:

NSCode常見用途
1.XIB/Storyboard
實作UIView的subclass的時候,希望要在initialize這個view時,就要做一些事情,不但要override掉initWithFrame,也要override掉initWithCoder。

如果view是用code寫出來的,就會呼叫到initWithFrame:
如果view是用interface Builder工具拉出來,view執行時,會進入initWithCoder:

概念:
第一步:用工具interface Builder拉出介面,會產生XIB或Storyboard檔案「XML格式」。
第二步:編譯APP時,Xcode會把XIB和Storyboard編譯成binary格式的data,分別是NIB和storyboardc檔案「也就是序列化過的objective-C view物件」。

比較:
visual studio 拉出window form,是讓介面產生程式碼。
xcode卻是先產生NIB和storyboardc檔案,然後再執行時,將這些檔案轉成view 物件。
PS:這個流程是使用NScoding protocol,從NIB/storybardc讀出view,呼叫的就是initWithCoder:。
可以在UIView的interface中,看到UIView實作了NSCoding protocol。

2.NSUserDefaults
用來儲存一些偏好設定,只要指定特定keys,就可以存入NSUserDefaults。
NSUserDefaults無法存入自己定義的class,要先透過NSCoding轉換成NSData後存入,最出時,也要多做一次unarchive。
下圖為存入UIColor

3.Copy and Paste
無論是copy and paste或Drag and Drop都透過pasteboard物件去實作。
拖曳的資料先暫存在一個pasteboard,到了要放開滑鼠時再從pasteboard取出資炓。
MAC上的pasteboard物件叫NSPasteboard
iOS上叫UIPastboard

下圖為寫入pasteboard

下圖讀出來:

4.Document-based App
在MAC上叫NSDocument 
在iOS上叫UIDocument
對各種不同類型文件做處理,開檔,儲存,等等。

一個可Document-based APP,先建立一個UIDocument的subclass,而這個subclass最重要的是實作開檔和讀檔二個method。
比如:建立KKPlaylist的document,裡面有個array,是KKSongTrack物件
如下

5.State Preservation and Restoration
用途讓iOS APP可以在開啟時,可立刻回復到上次閉關APP的狀況。

原理:
在應用程式關閉時,先把目前APP的狀態-像是目前所有view controller物件保存下來,下開應用程式時,如果有保存先前的狀態,就還原上次的view controller。

要實作State Preservation and Restoration,要對能被State Preservation 保存的view controller,要實作二個method。

下圖,在App Delegate要實作:

流程是:
1.在APP關閉時,系統先透過 -application:shouldSaveApplicationState:詢問是否要保存狀態,如果要,就回傳YES。
2.在前一步回傳yes後,系統會透過-application:shouldRestoreApplicationState:提供我們一個NSCoder,可透過NSCoder archive起來。

下圖為要保存navigation controller

3.在打開APP時,如果系統發現之前己有透過NSCoder保存狀態,那會透過-application:shouldRestoreApplicationState:去詢問是否要用上一次的狀態,要的就回YES。

4.接下來-application:didDecodeRestorableStateWithCoder:
就會被呼叫到,下圖為還原上次存下的navigation controller

相關閱讀

Data From KKBOX iOS /Mac OS X 基本開發教材

One clap, two clap, three clap, forty?

By clapping more or less, you can signal to us which stories really stand out.