iOS初步認識—數據的封裝以及簡單的MVC思想

數據的讀取

  • 當有一大堆數據需要使用時,直接將數據直接寫在代碼里面,不是一種合理的做法。如果數據經常改,就要經常翻開對應的代碼進行修改,造成代碼擴展性低

  • 例如:

    //通過懶加載
    - (NSArray *)imageArray
    {
    //通過字典模型加載數據
    if (_imageArray == nil) {
        self.imageArray = @[@{@"icon":@"singleBag",@"name":@"單肩包"},
                           @{@"icon":@"chainBag",@"name":@"鏈條包"},
                                 @{@"icon":@"wallet",@"name":@"錢包"},
                             @{@"icon":@"handBag",@"name":@"手提包"},
                         @{@"icon":@"backpack",@"name":@"雙肩包"},
                             @{@"icon":@"xiekuabao",@"name":@"斜挎包"}
                             .......一大堆數據..........];
    }
    return _imageArray;
    }
    
  • 因此,可以考慮將經常變的數據放在文件中進行存儲,程序啟動后從文件中讀取最新的數據。如果要變動數據,直接修改數據文件即可,不用修改代碼

  • 那么什么是plist文件?

    • 一般可以使用屬性列表文件存儲NSArray或者NSDictionary之類的數據,這種“屬性列表文件”的擴展名是plist,因此也稱為“plist文件”
    • 例如plist文件


      plist.png
    • 怎么添加plist文件


      添加plist文件.png
  • 怎么加載plist文件

    • 接下來通過代碼來解析Plist文件中的數據
    • 獲得Plist文件的全路徑

    NSBundle *bundle = [NSBundle mainBundle];
    NSString *path = [bundle pathForResource:@"shops" ofType:@"plist"];
    ```

    • 加載plist文件
_shops = [NSArray arrayWithContentsOfFile:path];
        ```
- Plist文件的解析過程
![解析過程.png](http://upload-images.jianshu.io/upload_images/1359971-e11bd04c6b4fdf33.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

## 懶加載
- 接下來通過代碼來解析Plist文件中的數據
- 獲得Plist文件的全路徑
    ```obj
NSBundle *bundle = [NSBundle mainBundle];
NSString *path = [bundle pathForResource:@"shops" ofType:@"plist"];
    ```
- 加載plist文件
```obj
_shops = [NSArray arrayWithContentsOfFile:path];
    ```

## 字典轉模型
- 什么是模型?
    - 所謂模型,其實就是數據模型,專門用來存放數據的對象,用它來表示數據會更加專業
- 用模型取代字典的好處
- 使用字典的壞處
    - 一般情況下,設置數據和取出數據都使用“字符串類型的key”,編寫這些key時,編輯器沒有智能提示,需要手敲
        ```obj
    dict[@"name"] = @"Jack";
NSString *name = dict[@"name"];
        ```
    - 手敲字符串key,key容易寫錯,Key如果寫錯了,編譯器不會有任何警告和報錯,造成設錯數據或者取錯數據
- 使用模型的好處
    - 模型設置數據和取出數據都是通過它的屬性,屬性名如果寫錯了,編譯器會馬上報錯,因此,保證了數據的正確性
    - 使用模型訪問屬性時,編譯器會提供一系列的提示,提高編碼效率
        ```obj
    app.name = @"Jack";
NSString *name = app.name;
        ```
- 字典轉模型的過程最好封裝在模型內部
    - 模型應該提供一個可以傳入字典參數的構造方法
        ```obj
        - (instancetype)initWithDict:(NSDictionary *)dict;
        + (instancetype)xxxWithDict:(NSDictionary *)dict;
        ```
## 注意
- instancetype在類型表示上,跟id一樣,可以表示任何對象類型
- instancetype只能用在返回值類型上,不能像id一樣用在參數類型上
- instancetype比id多一個好處:編譯器會檢測instancetype的真實類型

## 類前綴
使用Objective-C開發iOS程序時,最好在每個類名前面加一個前綴,用來標識這個類的“老家”在哪,目的是防止N個人開發了一樣的類,沖突了,比如Jake、Will、Kate、Room在同一個項目中都各自開發了個Button類,這樣的程序是不能運行起來的,解決方案:Jake Will的類名叫做JWButton,Kate Room的類名叫做KRButton


## 自定義View
- view的封裝
    - 如果一個view內部的子控件比較多,一般會考慮自定義一個view,把它內部子控件的創建屏蔽起來,不讓外界關心
    - 外界可以傳入對應的模型數據給view,view拿到模型數據后給內部的子控件設置對應的數據
- 封裝控件的基本步驟
    - 在initWithFrame:方法中添加子控件,提供便利構造方法
    - 在layoutSubviews方法中設置子控件的frame(一定要調用super的layoutSubviews)
    - 增加模型屬性,在模型屬性set方法中設置數據到子控件上

## 簡單的MVC
![MVC.png](http://upload-images.jianshu.io/upload_images/1359971-71a837417a7519bc.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容