美文网首页iOS DeveloperiOS学习笔记
IOS端图片处理app的开发(六)

IOS端图片处理app的开发(六)

作者: AirChen | 来源:发表于2016-09-03 22:16 被阅读0次

    将app的架构由MVC转向MVVC,会产生许多的优点,个人觉得在一下几个方面的优势比较突出。

    ​1.把视图控制器的业务逻辑与视图展示相互隔离,试视图控制器类专门来管理视图的展示,业务逻辑单独出来在另外一个ViewModel来管理。

    2.工程慢慢具体化了以后,项目中的文件会相当的多。如果遇到功能的更新,我们可以直接子类化一下ViewModel,再到视图控制器里更新一下ViewModel。如果遇到需要更换视图,可以将ViewModel重现绑定一下,不会对之前的业务逻辑产生任何影响。这也是将二则分隔开来,所带来的好处。

    由此可见,花点时间来将工程的架构转化成MVVC是值得的。

    在此,我们将之前的图片处理的项目进行一下转换。首先,观察一下工程下面目录,有ViewController和AppDelegate,由于没有涉及到数据结构,所以项目中暂时没有MVC中的数据Model,View在ViewController中作为一个成员属性;AppDelegate是UIApplication的代理,遵守UIApplicationDelegate协议,在这里可以将它归为项目中的其它部分。

    那么,由MVC转向MVVC的首要任务也就是将ViewController解耦。这里我们创建一个继承自NSObject的子类PicViewModel,再给该类创建如下成员属性:

    @property (strong, nonatomic)  UIImageView *imageView;

    @property (strong, nonatomic)  UIBarButtonItem *picBtn;

    @property (strong, nonatomic)  UISlider *sliderVal;

    @property (strong, nonatomic)  UIButton *dealB;

    @property (strong, nonatomic)  UIPickerView *picker;

    @property (strong, nonatomic)  UIViewController *totalVc;

    @property (nonatomic,strong)  RACCommand *picCommand;

    其中的视图空间要与视图控制器里的视图空间保持对应关系,RACCommand是第三方库ReactiveCocoa里面的一个类,用来发送信号,也是由MVC转向MVVC的关键属性(关于ReactiveCocoa的详细介绍,可参考我之前的博客《ReactiveCocoa一些学习摘抄》里面的一些资料)。在成员属性创建完成之后,我们可以复写一下初始化方法,把事件进行一下绑定,绑定的代码如下:

    _picCommand = [[RACCommand alloc] initWithSignalBlock:^RACSignal *(id input) {

         [self viewWillAppear];

         RACSignal *sig = [RACSignal createSignal:^RACDisposable *(id subscriber) {

         return nil;

         }];

    ​            return sig;

    }];

    在代码中调用[self viewWillAppear],就相当于调用视图控制器中的-(void)viewWillAppear:(BOOL)animated方法,一些业务逻辑的关系,我们都可以添加到viewWillAppear方法之下(这是个自定义方法!!)。

    完成这一步之后,ViewModel类就创建完成,接下来只需到原来的视图控制器中将视图控件与PicViewModel进行一下指向,再在视图加载方法中调用一下RACCommand成员的subscribeNext方法即可,具体代码如下:

    self.pictureVM.imageView = self.imageView;

    self.pictureVM.picBtn = self.picBtn;

    self.pictureVM.sliderVal = self.sliderVal;

    self.pictureVM.dealB = self.dealB;

    self.pictureVM.picker = self.picker;

    self.pictureVM.totalVc = self;

    RACSignal *sig = [self.pictureVM.picCommand execute:nil];

    [sig subscribeNext:^(id x) {

    }];

    转型完成之后,编译工程运行。如果各个功能和操作与之前一样,那么转型成功。

    其实由MVC转向MVVC步骤十分简单,但是所带来的益处是巨大的。花费一点点时间将项目改变一下架构,会非常有益于后期的开发,值得学习于借鉴。

    最后,该工程的完整代码请参考我的Github:https://github.com/AirChen/PictureDel

    该系列之前的文章请参考:http://blog.sina.com.cn/s/blog_bfb0501f0102vx1v.html

    相关文章

      网友评论

        本文标题:IOS端图片处理app的开发(六)

        本文链接:https://www.haomeiwen.com/subject/cxclettx.html