学习笔记 viewController瘦身

View controllers 通常是 iOS 项目中最大的文件,往往包含大量的protocol以及业务逻辑。所以 View controllers 中的代码几乎总是复用率最低的、最难维护的。我们可以尝试为view controller瘦身,让代码变的可以复用,易于维护。

把 Data Source 和其他 Protocols 分离出来

把 UITableViewDataSource 的代码提取出来放到一个单独的类中,是为 view controller 瘦身的强大技术之一。我们可以将tableView的数据处理抽象出来,建立独立的model类。这样可以完全将view、controller、model分离开来,方便维护与代码重用,对于复杂页面特别有好处。

在这里我们新建DDTableModel类处理tableView的数据逻辑,代码如下:

//DDTableModel.h
#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>
@interface DDTableModel : NSObject
<UITableViewDataSource>
+ (instancetype)defaultModel;
@end

//DDTableModel.m
@implementation DDTableModel
- (void)dealloc
{
    [dataList_ release];
    [super dealloc];
}
- (instancetype)init {
    self = [super init];
    if (self) {
        dataList_ = [[NSMutableArray alloc] initWithCapacity:1];
        [dataList_ addObject:@"1"];
        [dataList_ addObject:@"2"];
        [dataList_ addObject:@"3"];
    }
    return self;
}
+ (instancetype)defaultModel {
    DDTableModel *tableModel = [[DDTableModel alloc] init];
    return [tableModel autorelease];
}
#pragma mark - UITableViewDataSource
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    return dataList_.count;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    static NSString *identifier = @"DDViewControllerTableViewCell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:identifier];
    if (cell == nil) {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:identifier] autorelease];
    }
    cell.textLabel.text = [dataList_ objectAtIndex:indexPath.row];
    return cell;
}
@end


这样controller内的代码则相当精简,如下为controller内代码:

#import "DDViewController.h"
#import "DDTableModel.h"

@interface DDViewController ()

@property (nonatomic,retain) IBOutlet UITableView *tableView;
@property (nonatomic,retain) DDTableModel *tableModel;

@end

@implementation DDViewController

- (void)dealloc
{
    [_tableView release];
    [_tableModel release];
    [super dealloc];
}

- (instancetype)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {

    }
    return self;
}

- (void)viewDidLoad
{
    [super viewDidLoad];
    
    self.title = NSLocalizedString(@"table view", nil);
    
    self.tableModel = [DDTableModel defaultModel];
    self.tableView.dataSource = self.tableModel;
    self.tableView.delegate = self;
}

@end

同理,我们可以对view controller内的其他代码进行抽象,例如:业务逻辑,网络请求、页面显示等等,从而提到代码的质量。

你可能感兴趣的:(ios,代码质量,viewcontroller)