我是这样理解MVC的

版权声明:转载请标注原文地址。邮箱[email protected] https://blog.csdn.net/Xoxo_x/article/details/79674140

对于MVC,我想表达一点不一样的东西,以下观点是我对MVC的总结以及应用。如果你存有异议或者有什么要指教的,请留言或者联系我。
我擅长用的是MVC与模块化代码的结合,本身模块化就可以实现项目的解耦,配合MVC以及一些胶水代码,我发现项目维护起来十分容易

MVC可能是这样的:
这里写图片描述

首先,如果你是一个iOS的新人,你千万不要被UIViewController所蒙蔽,Controller是什么,是控制器,控制器,控制器,他一定要有viewDidLoad吗?不是的,一个控制器为什么他要有viewDidLoad?
一个控制器可能是这样的:

class XHPPController {

    private var ppTopController:XHPPTopController?
    private var ppBottomController:XHPPBottomController?

}
class XHPPTopController {

    private var ppTopView: XHPPTopView?
    private var movieLine: XHMoveLine?

    func addPPTopView(contentView:UIView,frame:CGRect){
        ppTopView = XHPPTopView(frame: frame)
        contentView.addSubview(ppTopView!)

        addMovieLineView(contentView: ppTopView!, frame: CGRect(x: 20, y: 18, width: 4, height: 56))
    }
}
class XHPPBottomController: NSObject {

    private var addedTagLabels: [XHTagLabel] = []
    private var needAddTags: [String] = []
    private var copyNeedAddTags: [String] = []

    private var bottomView: XHPPBottomView?
    private var lastAddTagDate: TimeInterval = 0

    private var tagDelay: TimeInterval = 0.5

    typealias animationHandle = ((_ error:Error?)->())

    var complete:animationHandle?

    private var bottomViewSpacingmodel:XHTagSpacingModel?

    private var timer: Timer?


    func addXHPPBottomView(contentView: UIView, frame: CGRect){
        bottomViewSpacingmodel = XHTagSpacingModel.creatXHTagSpacingModel(_leftInset: 0, _topInset: 0, _rightInset: 0, _bottomInset: 0, _lineSpacing: 10, _columnSpacing: 10)
        bottomView = XHPPBottomView()
        bottomView?.frame = frame
        contentView.addSubview(bottomView!)
    }
}

其实所有的交互逻辑都可以在XHPPController中完成,由于XHPPController的逻辑复杂,而且写在一起会粘合度非常大,胶水代码与实现代码难以明确的区分,所以我根据bottom、top拆出来两个controller:

 private var ppTopController:XHPPTopController?
 private var ppBottomController:XHPPBottomController?

每个controller分别控制一个自己相对应的逻辑,然后在controller中实现胶水代码。这样的模块化加MVC就非常好的解决了一个controller上千行代码的问题。
同时,如果产品的top需要更改,我只需要更改topController的代码,实现了代码的可读性以及维护性。

我的leader曾经和我讲过一句话,对我感触很大:
把你写的每一个模块化的功能,都严格要求自己以SDK的标准来实现
也就是提供给外界简单易读的API接口。

这样你看看,每一个模块分为几个小模块,如果模块再复杂,那就继续再分,然后每一个controller控制一个模块,添加胶水代码,有点像搭积木的感觉,感觉很棒。

此外,在谈一谈,关于值类型与引用类型!
好多iOS老铁们,竟然不知道这个,更别提堆和栈以及ARC原理以及循环应用导致内存泄露了,这些东西都是联系在一起的。你说这些你接触不到,那就说一些实际应用中,这些概念是有多么的重要吧!

String A  = "123"
String B = A
A = "456"
print B ?

class AClass {
    String A 
}
AClass aclass
aclaa.A = "123"

AClass bclass
bclass = aclass

aclass.A = "456"
bclass.A = ?

你可能可以回答出正确的答案,但是你有没有想过为什么?
如果你知道引用类型和值类型的特点,那就是原理,如果不知道建议翻看我以前的博客。我其实已经做出了解答:
https://blog.csdn.net/xoxo_x/article/details/78910979

ok,下面,我们就可以聊一下高级的东西了,性能优化!

这是一个比较难的问题,但是从堆栈的角度而言,我们可以这样优化。

首先,值类型存放在栈中,栈是有计算机控制的,引用类型放在堆中,是由ARC控制的。

所以,我们在新建一个Model时,用值类型、而非用引用类型,当然,可能你必须使用引用类型的情况除外,这就是对于内存优化的一点点处理。

此外了,还有切圆角,导致离屏渲染,会损失性能,如果是tableView中有大量的切圆角和数据,那么可能会很卡,你需要想其他的办法。

关于block,delegate,notification的说明:
首选block和delegate,当层次较深时使用notification,原因:
block 使代码更加紧凑, delegate 次之
notification的特性决定了他的尴尬地位

猜你喜欢

转载自blog.csdn.net/Xoxo_x/article/details/79674140