輕量化ViewControllers,讀文章做的總結

來源:互聯網
上載者:User

標籤:

推薦一個網站 http://objccn.io/ 我這兩天才開始看 獲益匪淺

看了第一篇文章 《更輕量的View Controllers》感覺寫的不錯 感覺作者 原文地址 http://objccn.io/issue-1-1/

樣本項目的代碼有點舊 Xcode6運行出錯 懶的理了 所以我大概模仿他寫了一點測試代碼 運行環境Xcode7/iOS9

 

輕量化ViewControllers 顧名思義 就是把ViewController的代碼進行簡化 讓控制器更簡單 更清晰

 

一、把DataSource和其他potocols分離出控制器

因為做項目很多控制器都是TableViewController,所以必須要有資料來源(TableViewDataSource)輸入,一般DataSource的3個方法都在控制器裡

我們的目的就是要把他分離出來,方法就是自訂一個類,然後控制器調用這個類

並且這個資料來源類是通用的,別的TableViewController或者有定義了tableView/collectionView的控制器都可以調用

 

自訂ArrayDataSource類

1.定義一個Block,用於傳遞cell和資料

typedef void (^TableViewCellPassBlock)(id cell,id item);

2.定義一個方法給控制器調用,用於初始化ArrayDataSource類(需要暴露在.h檔案中)

@property(nonatomic,strong) NSArray *items;

@property(nonatomic,copy) NSString *cellIdentifier;

@property(nonatomic,copy) TableViewCellPassBlock passBlock;

/**


 

 *  初始化資料來源的方法

 *  @param anItems         用於接受資料的數組

 *  @param aCellIdentifier 接收cell的ID

 *  @param aPassBlock      接收傳遞的Block

 */

- (id)initWithItems:(NSArray *)anItems

  cellIdentifier:(NSString *)aCellIdentifier

 passBlock:(TableViewCellPassBlock)aPassBlock{    self = [super init];    if(self){
self.items
= anItems; self.cellIdentifier = aCellIdentifier; self.passBlock = [aPassBlock copy]; } return self;}

 

3.然後就是資料來源的方法

/** 這個方法找出數組的資料 後面要用到*/- (id)itemAtIndexPath:(NSIndexPath *)indexPath{    return self.items[(NSUInteger) indexPath.row];}#pragma mark - UITableViewDataSource- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{    return self.items.count;}- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:self.cellIdentifier                                                            forIndexPath:indexPath];    id item = [self itemAtIndexPath:indexPath];    self.passBlock(cell, item);    return cell;}

 

ArrayDataSource類就這樣定義完成了

 

接下來是控制器的調用

只需要寫以下幾行代碼便可以設定tableView的資料來源,不用每個控制器都寫那三個方法

    //數組傳資料是接下來要簡化的,後面會詳細說明
  NSArray *arr = [AppDelegate sharedDelegate].returnModel.returnData; //使用Block回調,傳遞cell和模型資料 TableViewCellPassBlock passBlock = ^(TestModelCell *cell,TestModel *model){
    //測試方法,只是傳遞model給cell,這個方法用分類寫的,自訂cell的分類 [cell setName:model]; };
  //初始化並設定tableView的資料來源 self.dataSource
= [[ArrayDataSource alloc] initWithItems:arr cellIdentifier:@"TestModelCell" passBlock:passBlock]; self.tableView.dataSource = self.dataSource;

 

 

二、將商務邏輯放到model中

一些跟控制器無關的代碼可以放到模型中

測試代碼我寫了一個TestModel,只有一個屬性和一個初始化方法

@property(nonatomic,copy) NSString *name;- (instancetype)initWithName:(NSString *)name;

 

然後又寫了一個model,因為要返回資料所以我叫ReturnModel

在.h檔案中暴露的方法

//類方法,建立的時候用這個方法
+ (instancetype)returnModel;
//這個方法用於返回資料
- (NSArray *)returnData;

然後在.m檔案中

+ (instancetype)returnModel{    return [[self alloc] init];}- (id)init{    self = [super init];    if (self) {
  
    //調用方法執行商務邏輯的方法 [self doSomething]; }
return self;}
//可以在這個方法中執行與控制器無關的商務邏輯
- (void)doSomething{ NSLog(@"try to do something");}

//在這個方法中返回模型資料,資料略

- (NSArray *)returnData

{

  NSArray *arr = [[NSArray alloc] initWithObject:...];

  return arr;

}

 

思路就是在返回資料的模型類中執行商務邏輯,在建立類的時候執行

 

在AppDelegate中添加方法和屬性,並且暴露在.h檔案中

+ (instancetype)sharedDelegate{    return [UIApplication sharedApplication].delegate;}@synthesize returnModel = _returnModel;- (ReturnModel *)returnModel{    if (_returnModel == nil) {        _returnModel = [ReturnModel returnModel];    }    return _returnModel;}

 

所以控制器直接調用方法得到資料

NSArray *arr = [AppDelegate sharedDelegate].returnModel.returnData;

 

這時候控制器已經很簡化了

可以把網路請求也放在model層

 

 

最後吐槽一句部落格園的代碼高亮好難看

 

輕量化ViewControllers,讀文章做的總結

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.