IOS项目架构

作者: Faner_NG | 来源:发表于2021-07-17 12:24 被阅读0次

一、架构分层:

三层架构:

  • 应用层/界面层
  • 业务层
  • 数据层

四层架构:

  • 应用层/界面层
  • 业务层
  • 网络层
  • 本地数据层

理解:
应用层用来管理加载界面比如tableview。
业务层用来处理项目业务,比如处理登陆,加载列表数据等创建的manager/serveice类就属于业务层。
数据层,可分为网络层和本地数据层,分别用来发起网络请求,从本地存取数据库,提供数据给业务层。

例如一个新闻APP:


image.png

二、MVC/MVP/MVVM:

这三种架构都属于应用层层面的架构

1.MVC(苹果版) :

model —view —controller


image.png image.png

理解:UITableView就是典型的苹果版MVC架构:controller加载tableview,获取model数据,在controller中将model的内容填充给view,比如cell.nametext = model.name;
cell和model不相互依赖。

优点:model,view可以重复利用,可以单独使用(UITableView就是典型的苹果版MVC)
缺点:controller代码过于臃肿

2.MVC(变种版) :

model —view —controller


image.png

理解:也是我们常用的view绑定一个model,cell.userinfo = userInfoModel, 这样就把view属性的赋值操作放在view内部,可以隐藏view的一些属性。

优点:对controller瘦身,将view的内部细节封装,外界不知道view内部具体实现
缺点:view依赖于model

3.MVP:

model —view —presenter


image.png

理解:presenter内部完成view的model的绑定,view和model不相互依赖。controller只需创建管理presenter即可,从而使controller更加精简。

4.MVVM

model — view — view-model


image.png image.png

MVVM框架是在MVC的基础上演化而来,MVVM想要解决的问题是尽可能地减少Controller的任务。

  • Model:程序中要操纵的实际对象的抽象
  • View(ViewController):MVVM中的View不再是UIView的子类,而变成了UIViewController的子类。这里的View实际上就是MVC中剥离了处理呈现View逻辑部分的Controller,因此它仍然有各种UIView的属性,仍然有ViewController的声明周期的各种方法,但是这里的Controller不再负责数据的请求以及处理逻辑,因此不再臃肿。
  • ViewModel:MVVM中,ViewModel代替了MVC中的Controller成为了协调者的角色,ViewModel被View(ViewController)持有,同时持有Model。数据请求以及处理逻辑都放在ViewModel中,View(ViewController)就瘦了下来。

理解:viewmodel类似于presenter,controller只需创建管理viewmodel即可,从而使controller更加精简。
核心区别是view持有viewmodel,。
从而view可以监听viewmodel属性的变化,从而更新view。
所以一般MVVM+RAC/KVO搭配使用

viewcontroller.m
//创建并管理viewmodel
- (void)viewDidLoad {
    [super viewDidLoad];
    self.viewModel = [[AppViewModel alloc] initWithController:self];
}
ViewModel.m
//viewmodel创建并管理view和model,处理view的点击事件
- (instancetype)initWithController:(UIViewController *)controller
{
    if (self = [super init]) {
        self.controller = controller;
        
        // 创建View
        AppView *appView = [[AppView alloc] init];
        appView.frame = CGRectMake(100, 100, 100, 150);
        appView.delegate = self;
        //view持有viewmodel
        appView.viewModel = self;
        [controller.view addSubview:appView];
        
        // 加载模型数据
        App *app = [[App alloc] init];
        app.name = @"QQ";
        app.image = @"QQ";
        
        // 设置数据
        self.name = app.name;
        self.image = app.image;
    }
    return self;
}

#pragma mark - AppViewDelegate
- (void)appViewDidClick:(AppView *)appView
{
    NSLog(@"viewModel 监听了 appView 的点击");
}
view.m
//view拥有viewmodel,并监听viewmodel的属性变化
- (void)setViewModel:(AppViewModel *)viewModel
{
    _viewModel = viewModel;
    
    __weak typeof(self) waekSelf = self;
    [self.KVOController observe:viewModel keyPath:@"name" options:NSKeyValueObservingOptionNew block:^(id  _Nullable observer, id  _Nonnull object, NSDictionary<NSKeyValueChangeKey,id> * _Nonnull change) {
        waekSelf.nameLabel.text = change[NSKeyValueChangeNewKey];
    }];
    
    [self.KVOController observe:viewModel keyPath:@"image" options:NSKeyValueObservingOptionNew block:^(id  _Nullable observer, id  _Nonnull object, NSDictionary<NSKeyValueChangeKey,id> * _Nonnull change) {
        waekSelf.iconView.image = [UIImage imageNamed:change[NSKeyValueChangeNewKey]];
    }];
    
}

相关文章

  • 浅谈iOS区块链项目的架构设计

    浅谈iOS区块链项目的架构设计 浅谈iOS区块链项目的架构设计

  • 项目目录结构

    iOS新建项目架构规范

  • 仿今日头条项目架构

    仿今日头条项目架构 (一)—— ios11导航栏和tabBar层级仿今日头条项目架构 (二)—— 项目主架构的搭建...

  • iOS开发项目架构和开发流程

    1.项目架构iOS 端开发语言(object-c和swift混合编写)。项目架构模式采用MVVM + RAC + ...

  • 组件化

    支付宝客户端架构解析:iOS 容器化框架初探基于CocoaPods的iOS项目模块化实践ios项目-利用Pod进行...

  • 0

    iOS项目经验[https://www.jianshu.com/nb/49408472] iOS设计与架构资料[h...

  • [iOS-Practice] 项目结构

    总结时读到的一系列文章 iOS应用架构谈 开篇我的iOS工程结构iOS项目的目录结构-原创iOS 项目的目录结构能...

  • iOS架构

    这里说几个概念:iOS系统框架:iOS系统架构:iOS架构:iOS 代码架构:iOS架构师:iOS架构设计: iO...

  • iOS项目架构

    BWProjectFramework iOS Xcode Project Framework Content Xc...

  • iOS项目架构

    iOS项目架构 做了几个App,发现很多时候,App的基本框架都是一样的,如何组织架构,让项目更容易开发和维护,减...

网友评论

    本文标题:IOS项目架构

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