BaseModel的簡單使用
Model主要作用便是爲不同的數據創建對象,然後用於處理。我這裏使用上只用到兩個方面
1. 將服務器返回的數據轉換成對象model,方便開發時的使用和保存。
2. 將一些和數據相關的操作在model中進行處理。
1. 數據轉爲model對象
這個實現上比較簡單,原理就是鍵值對映射處理。已經寫好了一個BaseModel,使用時只需要繼承這個BaseModel即可。
@interface BaseModel : NSObject
//@property (nonatomic,copy)NSString *ret;//結果代碼 1成功 0接口驗證失敗 -1渠道編碼不存在
//@property (nonatomic,copy)NSString *tip;//結果描述
-(id)initWithDataDic:(NSDictionary*)data;//將字典轉換爲model
- (void)setAttributes:(NSDictionary*)dataDic;//鍵值對映射
- (NSDictionary*)attributeMapDictionary;
- (NSString *)customDescription;
- (NSString *)description;
- (NSData*)getArchivedData;
- (NSString *)cleanString:(NSString *)str; //清除\n和\r的字符串
- (NSDictionary *)convertToDictionary;//轉換爲字典
@end
實現操作流程如下
#import "MessageViewController.h"
#import "MessageModel.h"
@interface MessageViewController ()
@end
@implementation MessageViewController
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view.
self.title = @"消息";
//將jsonString轉換爲字典,此時一般是我們請求到服務器返回的json字符串後做的第一件事
//要求服務器返回的數據類型全爲string類型,ios的類型轉換對int,boolean較弱
NSString *jsonString = @"{\"name\":\"JSON中國\",\"url\":\"http://www.json.org.cn\",\"page\":\"88\",\"isNonProfit\":\"true\",\"address\":{\"street\":\"浙大路38號.\",\"city\":\"浙江杭州\",\"country\":\"中國\"},\"links\":[{\"name\":\"Google\",\"url\":\"http://www.google.com\"},{\"name\":\"Baidu\",\"url\":\"http://www.baidu.com\"},{\"name\":\"SoSo\",\"url\":\"http://www.SoSo.com\"}]}";
NSData *jsonData = [jsonString dataUsingEncoding:NSUTF8StringEncoding];
NSError *err;
NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:jsonData
options:NSJSONReadingMutableContainers
error:&err];
NSLog(@"%@",dic);
// 從打印出來的結果看,可以知道最外層有6個鍵值對,其中address和links較爲特殊
// address可看做一個單獨的對象,裏面包含有三個鍵值對
// links是一個數組,每個數組裏面可以看做是一個單獨的對象,每個對象中包含兩個鍵值對
// 根據我提到到每個單獨數據模塊都可以視爲一個對象的話,因此我們此數據類型可以劃分成三個數據model
// 1.最外層包含了全部數據的MessageModel
// 2.addressModel
// 3.linksModel
// {
// address = {
// city = "\U6d59\U6c5f\U676d\U5dde";
// country = "\U4e2d\U56fd";
// street = "\U6d59\U5927\U8def38\U53f7.";
// };
// isNonProfit = true;
// links = (
// {
// name = Google;
// url = "http://www.google.com";
// },
// {
// name = Baidu;
// url = "http://www.baidu.com";
// },
// {
// name = SoSo;
// url = "http://www.SoSo.com";
// }
// );
// name = "JSON\U4e2d\U56fd";
// page = 88;
// url = "http://www.json.org.cn";
// }
//建立三個model對象,並且對應每個對象的內容都創建屬性
//將字典轉爲model數據以及調用方法如下
MessageModel *model = [[MessageModel alloc]initWithDataDic:dic];
NSLog(@"%@",model.name);
NSLog(@"%@",model.address.city);
NSLog(@"%@",((MessageLinkModel *)model.links[0]).name);
}
生成的文件結構
對於像AddressModel這樣簡單的對象,裏面包含的只是單一鍵值對的,我們無需在.m文件中有操作
2. 數據的動態變更與處理
我們接着完善User這個我們前面提到的model。這個model除了將服務器返回的數據轉換爲model讓我們使用外,還使用本地化技術將其保存到了本地。
這裏另外需要提到的是一個開發小技巧
對於本地化存儲的數據,如果需要更改其中某個數據的值,我們可以通過重寫set賦值方法來實現,只要調用了某個屬性的set方法我們就將值修改後重新保存到本地。
//修改屬性值
- (void)setUname:(NSString *)uname
{
_uname = uname;
[self writeToFile];
}
對於一些依據數據進行不同操作的簡單邏輯我們也可以在這裏面進行操作。比如如果這個user中還有性別和簽名兩個屬性。性別男女對應不同的簽名時,我們可以在獲得性別後在user中設定簽名的值。