欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

我是这样理解MVC的

程序员文章站 2022-05-04 12:52:37
...

对于MVC,我想表达一点不一样的东西,以下观点是我对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的特性决定了他的尴尬地位