首页
网站首页
公司简介
资讯中心
推荐内容
返回顶部
MVP模式是你的救命稻草吗,仿网易APP界面封装
发布时间:2020-04-07 02:52
浏览次数:

不管是MVC还是MVP,亦或则其他架构,它们的设计目的都是为了达到编码的最高境界,那就是:低藕合,高复用,易测试,好维护。

Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。他很轻巧,CPU/内存低消耗,所也笔者选择了docker作为虚拟化工具

目录 我是代码

  1. 字体放大
  2. 颜色RGBA
  3. 滑块
  4. 内容类型
  5. 实现效果方法
  6. Layout, 旋转
  7. CRUD
  8. cocoaPods
  9. 使用
  10. 问答个人测试有限, 如果有什么问题请评论或issue我 GitHub

1、什么是XML

而要达到这个终极目标,首先要理解的是每个部分各自负责些什么,以及如何组合在一起。因此我个人认为,学习架构关键在两步:

1.安装for Mac

从官网下载dockerDocker Toolbox,下载完成,点下一步下一步就安装好了是不是很简单。

图片 1style.gif图片 2zoom.gif

  • 全称是Extensible Markup Language,译作“可扩展标记语言”
  • 跟JSON一样,也是常用的一种用于交互的数据格式
  • 一般也叫XML文档(XML Document
  1. 如何把缠在一起的代码拆分
  2. 如何把拆开的代码再组合

2.构建镜像

docker search [name] #查找官网提供的镜像

docker pull busybox #安装官网提供的镜像

一开始选择的是UIButton, 改变UIFont, 效果如上, 如以上下抖动的方式增减, UILable也同样, 找不到其他方式. 最后用的是缩放, 问题是连UIButton整个控件都会缩放, 理想中效果想要只缩放里面的UILable.

2、XML语法

很多新手在刚做项目时,都会把所有的代码,如数据的访问和处理,数据的展示,用户的输入都写在一起,代码和思维都呈现出一种线性的形式,一切都是直来直往的。这样代码量确实少,写的时候也觉得方便,但是带来了几个致命的问题:

3.构建php开发环境

使用Dockerfile文件

# 从官方PHP镜像构建FROM php# 将index.php复制到容器内的/var/www目录下ADD index.php /var/www/# 对外暴露8080端口EXPOSE 8080# 设置容器默认工作目录为/var/wwwWORKDIR /var/www/# 容器运行后默认执行的指令ENTRYPOINT ["php", "-S", "0.0.0.0:8080"]

构建容器

docker build -t allovince/php-helloworld .

运行这个容器

docker run -d -p 8080:8080 allovince/php-helloworld

安装更多的服务

FROM phpADD index.php /var/www/# 安装更多服务RUN apt-get install -y  mysql-server  nginx  php5-fpm  php5-mysql# 编写一个启动脚本启动所有服务ENTRYPOINT ["/opt/bin/php-nginx-mysql-start.sh"]

这种安装方式会有也下问题:

  1. 如果需要验证某个服务的不同版本,比如测试PHP5.3/5.4/5.5/5.6,就必须准备4个镜像,但其实每个镜像只有很小的差异。
  2. 如果开始新的项目,那么容器内安装的服务会不断膨胀,最终无法弄清楚哪个服务是属于哪个项目的

使用单一的容器安装方式:

FROM ubuntu:14.04RUN apt-get update -y && apt-get install -y nginxFROM ubuntu:14.04RUN apt-get update -y && apt-get install -y mysql这种方式的优点在于所有服务可以有一个统一的基础镜像,对镜像进行扩展和修改时可以使用同样的方式,比如选择了ubuntu,就可以使用apt-get指令安装服务。

这种方式的优点在于所有服务可以有一个统一的基础镜像,对镜像进行扩展和修改时可以使用同样的方式,比如选择了ubuntu,就可以使用apt-get指令安装服务。

问题在于大量的服务需要自己维护,特别是有时候需要某个服务的不同版本时,往往需要直接编译源码,调试维护成本都很高。

出现的问题 : 不影响视觉效果, 影响可能多的自定义UIButton 自定义的时候背景色只能设置它的容器->UIScroll滚动的时候要取原来的x坐标,width等

  • 一个常见的XML文档一般由以下部分组成
  1. 当业务越来越复杂时,修改代码成了噩梦。同样的逻辑放在不同的地方,本来只用改一处的变成了需要改几百处。而又因为所有的逻辑都互相牵扯住,导致本来只想改一处的,结果却影响了几百处。
  2. 当时间越来越遥远时,理解代码成了噩梦。本来只需要阅读几行的时候,却因为所有的代码都杂在一起变成了要阅读几千行。时间一长,重新阅读时,别说别人,就是自己也很难一下就能掌握关键点。
  3. 当需要做一个功能时,却发现代码无法复用,明明是一样的逻辑也只能靠Ctrl+CCtrl+V。这又为今后修改代码时增加了工作量。
  4. 当需要测试时确发现很难进行测试,每次修改一处代码后都必须进行重复的人工测试,无法进行自动化测试,模块和模块也无法拆开来进行独立的单元测试,每次都要整体的测一遍才能确保一切完好如初。

参考

Docker在PHP项目开发环境中的应用

基于 Docker 的 PHP 开发环境

一开始仿的是网易新闻的APP, 黑>红, 想半天没明白, 后来对照了RGB,黑 (R:0 G:0 B:0)红 (R:0 G:255 B:0) 好了, 问题解决了. 之后就扩展了RGBA, 不过本人色弱, 不同值之间转换时颜色效果我是忽略了

其实目前市面上的架构模式已经有很多种,各有不同,但模式终究只是一种设计理念的表现形式,学习再多的架构,你也只是多会用了几种工具而已,学习一种模式其实是在学一种思维方式:

自定义: YFTagItemConfigration block = ^UIButton *(UIButton *itemBtn, NSUInteger index){ if (index == 0) { // 选中状态 注意全是 UIControlStateNormal [itemBtn setTitleColor:[UIColor colorWithRed:0.4 green:0.0 blue:1.0 alpha:0.3] forState:UIControlStateNormal]; }else { // 默认状态 [itemBtn setTitleColor:[UIColor colorWithRed:1.0 green:0.0 blue:1.0 alpha:1.0] forState:UIControlStateNormal]; } itemBtn.titleLabel.font = [UIFont systemFontOfSize:15]; // 大小按缩放比例 return itemBtn; };
  • 文档声明
    • 在XML文档的最前面,必须编写一个文档声明,用来声明XML文档的类型
    • 最简单的声明 :<?xml version="1.0" ?>
    • 用encoding属性说明文档的字符编码:<?xml version="1.0" encoding="UTF-8" ?>
  • 元素
  • 属性(Attribute)
    • 一个元素可以拥有多个属性
    • 属性值必须用 双引号"" 或者 单引号'' 括住
    • 实际上,属性表示的信息也可以用子元素来表示

如何在解决问题的时候把问题合理的拆分,又如何将拆分的零件合理的组装成解决问题的工具。

扇贝APP, 有变宽度的效果. 还好开始时就想到给滑块加个容器, 好处就很明显了, 移动的时候控制容器, 滑块的宽度重写容器的setter就可以, 宽度可以自定义, 也可以根据标签串长度+自定义数值

3、XML的解析方式

将这种思维方式深入到你的大脑里,血液里,直至骨髓,让它成为你思考问题的一种习惯和定式,逐渐成为你的一部分,那么这时你已达到无招胜有招的境界了。

typedef NS_ENUM(NSUInteger, YFSliderType) { YFSliderTypeNone, // 没有 YFSliderTypeTop, // 上面, 放在标签ScrollView YFSliderTypeMid, // 中间 YFSliderTypeBottom, // 下面 YFSliderTypeBottomAlone // 下面独立, 宽度和标签ScrollView一样的UIScrollView};
  • SAX:从根元素开始,按顺序一个元素一个元素往下解析,比较适合解析大文件

    • 大小文件都可以
    • NSXMLParser 苹果原生
  • DOM:一次性将整个XML文档加载进内存,比较适合解析小文件

    • 最好是小文件
    • GDataXML:DOM方式解析,由Google开发,基于libxml2

闲话先不扯了,回正题。

可以的UIViewController 或 UIView , 且两者嵌套切换时需要立即刷新, 我用的是 继承或Category如果需要重用UIViewController, 请看 Demo

4、第三方框架

这里首先需要说明的是无论MVP或MVC还是MVVM等任何一种架构和模式其实都没有谁优谁劣之分,而且就算是同一种架构,也可以根据不同的使用场景来做不同的实现方式,这里并没有宇宙绝对的对错标准和概念定义。这和张三丰在教无忌太极拳以后让其先忘掉招式是一样的道理,在应用型领域,定式和概念只应是在学习的过程中才存在的,而真正学会以后应该马上忘掉定式,忘掉概念,将其用熟用活才是关键。

// 获取当前屏幕显示的viewcontroller- (UIViewController *)viewController:view{ UIResponder *responder = view; while ((responder = [responder nextResponder])) if ([responder isKindOfClass: [UIViewController class]]) return (UIViewController *)responder; // If the view controller isn't found, return nil. return nil;}
  • libxml2:纯C语言,默认包含在iOS SDK中,同时支持DOM和SAX方式解析
  • GDataXML:DOM方式解析,由Google开发,基于libxml2
友情链接: 网站地图
Copyright © 2015-2019 http://www.nflfreepicks.net. 新葡萄京娱乐场网址有限公司 版权所有