2015年9月2日 星期三

iOS筆記:MVC & lazy instantiation & Blocks

MVC (Model-View-Controller)

MVC 之所以重要在於 iOS 的所有設計都遵循著 Model-View-Controller 的設計原則.

Model – App 中所有的資料, Data (通訊錄 App 裡的所有聯絡人)
View – 所有使用者看得到的畫面 (ex. UILabel…)
Controller – 如何利用 Model 來呈現畫面 (View) 的所有邏輯

enter image description here

從上圖
雙黃線 – 禁止 Model 與 View 直接間接的接觸
白色虛實線 – Controller 可以直接一手跟 Model 拿資料,另一手命令 View 做事;但 Model 與 View 卻不能直接與 Controller 溝通,只能透過間接的方式委曲求全。

在 iOS 開發過程中,View 和 Model 會透過何種間接的方式與 Controller 做溝通。
View 有三種方式。
1. Action – Target :Controller 明白告訴 View「事情發生的時候,你可以做 action,action 的行為內容請找 target 要」。而這個 target 通常是 Controller。
2. Delegate:Controller 指派一個隨從 (delegate) 給 View,這個隨從會處理N件事,遇到這些事請通報他。這個隨從通常也是 Controller。
3. DataSource:Controller 指派一個倉管 (dataSource) 給 View,這個倉管可以提供部分資訊來源,需要索取這些資料請叫他。這個倉管也往往是 Controller (笑)。

Model 只有一種。
1. Notification & KVO:Model 透過主動廣播的方式,讓 Controller 知道資料有所變更;背後的運作原理是透過 KVO 的方式 (Key-Value Observing),當 Model 廣播的訊息帶有某個 Key 值,而這個 Key 值列在 Controller 的觀察名單內時,Controller 就會收到資料更新的訊息,接著可以做相對應的處理動作。

MVC Model Illustrated Using Simple Table as Example

The app displays a list of recipes in the table view. If you turn the concept into visual representation, here is how the table data is displayed:

enter image description here

The recipe information that are stored in separate array objects is the Model. Each table row maps to an element of the recipe arrays. The UITableView object is the View that is the interface to be seen by the user. It’s responsible for all the visuals (e.g. color of the table rows, font size and type). The TableViewController acts as the bridge between the TableView and Recipe data model. When display table data, UITableView actually asks the Controller for the data to display, that in turn, picks the data from the model.

lazy instantiation

Waiting until last second to instantiate something that you need.
當你真的需要使用,才真的會分配(記憶體)給你使用.
在什麼時候你會需要使用? 如果你的變數的值,是需要等到物件初始化完成後才能明確的定義,這時你就會需要.

@property (nonatomic, strong) NSMutableArray *players;

- (NSMutableArray *)players {
    if (!_players) {
        _players = [[NSMutableArray alloc] init];
    }
    return _players;
}

Blocks

ReturnType (^blockName)(Parameters)

int (^WeAreBlocks) (int) = ^(int number) {return number*3}

第一個 int,如同我們宣告函式一樣,我們宣告 WeAreBlocks 這個 Block 變數的回傳值是int型態。接下來括弧內我們指定 Block 的名稱為 WeAreBlocks,其中一個最重要的符號是 ^ 這是告訴編譯器我要宣告 WeAreBlocks 為這個 Block 的名稱。第三個在括弧內的 int 為提供給 Block 的參數。

接著到等號的右邊,先使用 Block 的宣告符號 ^,在接下來的括弧內宣告型態及變數,而這個變數是當做提供給後方大括弧內的程式碼所使用的輸入參數。最後大括弧內含的即為這個 Block 的所運行的程式碼。

Blocks are objects, so they can be stored to NSArray or NSDictionary data structures, as well as to be returned from methods, even to be assigned to variables. Blocks have two great features:

  1. They can be executed in a later time, and not when the code of the scope they have been implemented is being executed.
  2. Their usage leads eventually to a much cleaner and tidier code writing, as they can be used instead of delegate methods, written just in one place and not spread to many files.

A block can be declared as a class member variable.

@interface ViewController ()
@property (nonatomic, strong) NSString *(^blockAsAMemberVar)(void);
@end

// … and then inside the viewDidLoad add this
_blockAsAMemberVar = ^(void){
        return @"This block is declared as a member variable!";
    };

參考:
http://www.sappmemo.com/2012/08/13/181/ios-tutorial-1-on-the-ios-mvc-model-view-controller/
http://mikebuss.com/2014/06/22/lazy-initialization-swift/
http://www.appcoda.com/objective-c-blocks-tutorial/
http://popcornylu.blogspot.tw/2011/08/objective-c-block.html

沒有留言:

張貼留言