代码拉取完成,页面将自动刷新
<!DOCTYPE HTML>
<html lang="" >
<head>
<meta charset="UTF-8">
<meta content="text/html; charset=utf-8" http-equiv="Content-Type">
<title>项目架构 · GitBook</title>
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="description" content="">
<meta name="generator" content="GitBook 3.2.3">
<link rel="stylesheet" href="gitbook/style.css">
<link rel="stylesheet" href="gitbook/gitbook-plugin-highlight/website.css">
<link rel="stylesheet" href="gitbook/gitbook-plugin-search/search.css">
<link rel="stylesheet" href="gitbook/gitbook-plugin-fontsettings/website.css">
<meta name="HandheldFriendly" content="true"/>
<meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no">
<meta name="apple-mobile-web-app-capable" content="yes">
<meta name="apple-mobile-web-app-status-bar-style" content="black">
<link rel="apple-touch-icon-precomposed" sizes="152x152" href="gitbook/images/apple-touch-icon-precomposed-152.png">
<link rel="shortcut icon" href="gitbook/images/favicon.ico" type="image/x-icon">
<link rel="next" href="Design-patterns.html" />
<link rel="prev" href="Runloop.html" />
</head>
<body>
<div class="book">
<div class="book-summary">
<div id="book-search-input" role="search">
<input type="text" placeholder="Type to search" />
</div>
<nav role="navigation">
<ul class="summary">
<li class="chapter " data-level="1.1" data-path="./">
<a href="./">
关于
</a>
</li>
<li class="header">Part I</li>
<li class="chapter " data-level="2.1" data-path="Data-structure.html">
<a href="Data-structure.html">
数据结构
</a>
</li>
<li class="chapter " data-level="2.2" data-path="Arithmetic.html">
<a href="Arithmetic.html">
算法
</a>
</li>
<li class="header">Part II</li>
<li class="chapter " data-level="3.1" data-path="Foundation.html">
<a href="Foundation.html">
Foundation
</a>
</li>
<li class="chapter " data-level="3.2" data-path="UIKit.html">
<a href="UIKit.html">
UIKit
</a>
</li>
<li class="chapter " data-level="3.3" data-path="WebView.html">
<a href="WebView.html">
WebView
</a>
</li>
<li class="chapter " data-level="3.4" data-path="Memory-management.html">
<a href="Memory-management.html">
内存管理
</a>
</li>
<li class="chapter " data-level="3.5" data-path="Message-passing.html">
<a href="Message-passing.html">
消息传递的方式
</a>
</li>
<li class="chapter " data-level="3.6" data-path="Network.html">
<a href="Network.html">
网络
</a>
</li>
<li class="chapter " data-level="3.7" data-path="Data-storage.html">
<a href="Data-storage.html">
数据存储
</a>
</li>
<li class="chapter " data-level="3.8" data-path="Multi-thread.html">
<a href="Multi-thread.html">
多线程
</a>
</li>
<li class="chapter " data-level="3.9" data-path="Animation.html">
<a href="Animation.html">
动画
</a>
</li>
<li class="chapter " data-level="3.10" data-path="Image-processing.html">
<a href="Image-processing.html">
图像处理
</a>
</li>
<li class="chapter " data-level="3.11" data-path="Data-encryption.html">
<a href="Data-encryption.html">
数据安全及加密
</a>
</li>
<li class="chapter " data-level="3.12" data-path="Runtime.html">
<a href="Runtime.html">
Runtime
</a>
</li>
<li class="chapter " data-level="3.13" data-path="Runloop.html">
<a href="Runloop.html">
Runloop
</a>
</li>
<li class="header">Part III</li>
<li class="chapter active" data-level="4.1" data-path="Project-organization.html">
<a href="Project-organization.html">
项目架构
</a>
</li>
<li class="chapter " data-level="4.2" data-path="Design-patterns.html">
<a href="Design-patterns.html">
设计模式
</a>
</li>
<li class="chapter " data-level="4.3" data-path="Component-based.html">
<a href="Component-based.html">
组件化
</a>
</li>
<li class="chapter " data-level="4.4" data-path="Debug-tips.html">
<a href="Debug-tips.html">
调试技巧
</a>
</li>
<li class="chapter " data-level="4.5" data-path="Performance-optimization.html">
<a href="Performance-optimization.html">
性能优化
</a>
</li>
<li class="chapter " data-level="4.6" data-path="Source-code.html">
<a href="Source-code.html">
源码理解
</a>
</li>
<li class="chapter " data-level="4.7" data-path="Code-management.html">
<a href="Code-management.html">
代码管理
</a>
</li>
<li class="chapter " data-level="4.8" data-path="Continuous-integration.html">
<a href="Continuous-integration.html">
持续集成
</a>
</li>
<li class="divider"></li>
<li>
<a href="https://www.gitbook.com" target="blank" class="gitbook-link">
Published with GitBook
</a>
</li>
</ul>
</nav>
</div>
<div class="book-body">
<div class="body-inner">
<div class="book-header" role="navigation">
<!-- Title -->
<h1>
<i class="fa fa-circle-o-notch fa-spin"></i>
<a href="." >项目架构</a>
</h1>
</div>
<div class="page-wrapper" tabindex="-1" role="main">
<div class="page-inner">
<div id="book-search-results">
<div class="search-noresults">
<section class="normal markdown-section">
<h1 id="项目架构">项目架构</h1>
<h2 id="1mvc、mvp、mvvm模式">1.MVC、MVP、MVVM模式</h2>
<h3 id="mvc(model、view、controller)">MVC(Model、View、Controller)</h3>
<p>MVC是比较直观的架构模式,最核心的就是通过Controller层来进行调控,首先看一下官方提供的MVC示意图:</p>
<p><img src="https://qn.nobady.cn/iOS/mvc.png" alt="mvc"></p>
<ul>
<li><p>Model和View永远不能相互通信,只能通过Controller传递</p>
</li>
<li><p>Controller可以直接与Model对话(读写调用Model),Model通过NOtification和KVO机制与Controller间接通信</p>
</li>
</ul>
<p>Controller可以直接与View对话,通过IBoutlet直接操作View,IBoutlet直接对应View的控件(例如创建一个Button:需声明一个 IBOutlet UIButton * btn),View通过action向Controller报告时间的发生(用户点击了按钮)。Controller是View的直接数据源</p>
<ul>
<li><p>优点:对于混乱的项目组织方式,有了一个明确的组织方式。通过Controller来掌控全局,同时将View展示和Model的变化分开</p>
</li>
<li><p>缺点:愈发笨重的Controller,随着业务逻辑的增加,大量的代码放进Controller,导致Controller越来越臃肿,堆积成千上万行代码,后期维护起来费时费力</p>
</li>
</ul>
<h3 id="mvp(model、view、presenter)">MVP(Model、View、Presenter)</h3>
<p>MVP模式是MVC模式的一个演化版本,其中Model与MVC模式中Model层没有太大区别,主要提供数据存储功能,一般都是用来封装网络获取的json数据;View与MVC中的View层有一些差别,MVP中的View层可以是viewController、view等控件;Presenter层则是作为Model和View的中介,从Model层获取数据之后传给View。</p>
<p><img src="https://qn.nobady.cn/iOS/mvp.png" alt="mvp"></p>
<p>从上图可以看出,从MVC模式中增加了Presenter层,将UIViewController中复杂的业务逻辑、网络请求等剥离出来。</p>
<ul>
<li><p>优点 模型和视图完全分离,可以做到修改视图而不影响模型;更高效的使用模型,View不依赖Model,可以说VIew能做到对业务逻辑完全分离</p>
</li>
<li><p>缺点 Presenter中除了处理业务逻辑以外,还要处理View-Model两层的协调,也会导致Presenter层的臃肿</p>
</li>
</ul>
<h3 id="mvvm(model、controllerview、viewmodel)">MVVM(Model、Controller/View、ViewModel)</h3>
<p>在MVVM中,view和ViewCOntroller联系在一起,我们把它们视为一个组件,view和ViewController都不能直接引用model,而是引用是视图模型即ViewModel。
viewModel是一个用来放置用户输入验证逻辑、视图显示逻辑、网络请求等业务逻辑的地方,这样的设计模式,会轻微增加代码量,但是会减少代码的复杂性</p>
<ul>
<li><p>优点 VIew可以独立于Model的变化和修改,一个ViewModel可以绑定到不同的View上,降低耦合,增加重用</p>
</li>
<li><p>缺点 过于简单的项目不适用、大型的项目视图状态较多时构建和维护成本太大</p>
</li>
</ul>
<p>合理的运用架构模式有利于项目、团队开发工作,但是到底选择哪个设计模式,哪种设计模式更好,就像本文开头所说,不同的设计模式,只是让不同的场景有了更多的选择方案。根据项目场景和开发需求,选择最合适的解决方案。</p>
<h2 id="2关于rac你有怎样运用到解决不同api依赖关系">2.关于RAC你有怎样运用到解决不同API依赖关系</h2>
<ul>
<li><p>信号的依赖:使用场景是当信号A执行完才会执行信号B,和请求的依赖很类似,例如请求A请求完毕才执行请求B,我们需要注意信号A必须要执行发送完成信号,否则信号B无法执行</p>
<pre><code class="lang-c"> <span class="hljs-comment">//这相当于网络请求中的依赖,必须先执行完信号A才会执行信号B</span>
<span class="hljs-comment">//经常用作一个请求执行完毕后,才会执行另一个请求</span>
<span class="hljs-comment">//注意信号A必须要执行发送完成信号,否则信号B无法执行</span>
RACSignal * concatSignal = [self.signalA concat:self.signalB]
<span class="hljs-comment">//这里我们是对这个拼接信号进行订阅</span>
[concatSignal subscribeNext:^(id x) {
NSLog(@<span class="hljs-string">"%@"</span>,x);
}];
</code></pre>
<h2 id="3weakify和我们宏定义的weakself有什么区别?">3.@weakify和我们宏定义的WeakSelf有什么区别?</h2>
</li>
</ul>
<p>@weakify 可以多参数使用</p>
<h2 id="4微服务架构设想。">4.微服务架构设想。</h2>
<p>微服务架构具有以下优势:</p>
<ul>
<li><p>1.灵活和独立的可扩展性</p>
<p> 灵活扩展是微服务架构的主要优势之一。与单片架构不同,每个模块都可以水平扩展并独立于其他模块。因此,微服务架构非常适合大型项目。 </p>
</li>
<li><p>2.独立技术堆栈</p>
<p> 在微服务架构中,软件工程师有机会使用各种工具和技术构建APP。代码可以用不同的编程语言编写,这为APP开发过程增加了更多的灵活性。</p>
</li>
<li><p>3.更好的故障隔离 </p>
<p> 如果一个服务失败,它不会影响其他服务的功能。与其他体系结构样式相比,在微服务中,系统继续工作,单片模式下的问题会影响整个APP。</p>
</li>
<li><p>4.易于部署和集成</p>
<p> 虽然即使是小代码更改的情况下,开发人员也必须再次部署APP,但在微服务架构中,部署变得更快更轻松。</p>
<p> 由于所有服务都是围绕单一业务流程构建的,因此程序员不必修改和重新部署整个APP,只需要您需要的区域。因此,改进产品也比较简单。</p>
<p> 微服务可以通过全自动部署机制独立部署。此外,通过使用开源持续集成工具,开发人员大大简化了与第三方服务的集成。</p>
</li>
<li><p>5.容易理解</p>
<p> 微服务体系结构的另一个优点是很容易理解系统是如何工作的以及它是如何开发的。当一个新的团队成员来到这个项目并且必须快速钻研它时,这特别有用。</p>
</li>
</ul>
<p>那么在iOS中如何借鉴这种思想去构建我们的App呢?是需要我们开发者自己去不断探索的</p>
</section>
</div>
<div class="search-results">
<div class="has-results">
<h1 class="search-results-title"><span class='search-results-count'></span> results matching "<span class='search-query'></span>"</h1>
<ul class="search-results-list"></ul>
</div>
<div class="no-results">
<h1 class="search-results-title">No results matching "<span class='search-query'></span>"</h1>
</div>
</div>
</div>
</div>
</div>
</div>
<a href="Runloop.html" class="navigation navigation-prev " aria-label="Previous page: Runloop">
<i class="fa fa-angle-left"></i>
</a>
<a href="Design-patterns.html" class="navigation navigation-next " aria-label="Next page: 设计模式">
<i class="fa fa-angle-right"></i>
</a>
</div>
<script>
var gitbook = gitbook || [];
gitbook.push(function() {
gitbook.page.hasChanged({"page":{"title":"项目架构","level":"4.1","depth":1,"next":{"title":"设计模式","level":"4.2","depth":1,"path":"Design-patterns.md","ref":"Design-patterns.md","articles":[]},"previous":{"title":"Runloop","level":"3.13","depth":1,"path":"Runloop.md","ref":"Runloop.md","articles":[]},"dir":"ltr"},"config":{"gitbook":"*","theme":"default","variables":{},"plugins":["livereload"],"pluginsConfig":{"livereload":{},"highlight":{},"search":{},"lunr":{"maxIndexSize":1000000,"ignoreSpecialCharacters":false},"sharing":{"facebook":true,"twitter":true,"google":false,"weibo":false,"instapaper":false,"vk":false,"all":["facebook","google","twitter","weibo","instapaper"]},"fontsettings":{"theme":"white","family":"sans","size":2},"theme-default":{"styles":{"website":"styles/website.css","pdf":"styles/pdf.css","epub":"styles/epub.css","mobi":"styles/mobi.css","ebook":"styles/ebook.css","print":"styles/print.css"},"showLevel":false}},"structure":{"langs":"LANGS.md","readme":"README.md","glossary":"GLOSSARY.md","summary":"SUMMARY.md"},"pdf":{"pageNumbers":true,"fontSize":12,"fontFamily":"Arial","paperSize":"a4","chapterMark":"pagebreak","pageBreaksBefore":"/","margin":{"right":62,"left":62,"top":56,"bottom":56}},"styles":{"website":"styles/website.css","pdf":"styles/pdf.css","epub":"styles/epub.css","mobi":"styles/mobi.css","ebook":"styles/ebook.css","print":"styles/print.css"}},"file":{"path":"Project-organization.md","mtime":"2020-04-13T10:23:32.000Z","type":"markdown"},"gitbook":{"version":"3.2.3","time":"2020-05-27T09:12:21.691Z"},"basePath":".","book":{"language":""}});
});
</script>
</div>
<script src="gitbook/gitbook.js"></script>
<script src="gitbook/theme.js"></script>
<script src="gitbook/gitbook-plugin-livereload/plugin.js"></script>
<script src="gitbook/gitbook-plugin-search/search-engine.js"></script>
<script src="gitbook/gitbook-plugin-search/search.js"></script>
<script src="gitbook/gitbook-plugin-lunr/lunr.min.js"></script>
<script src="gitbook/gitbook-plugin-lunr/search-lunr.js"></script>
<script src="gitbook/gitbook-plugin-sharing/buttons.js"></script>
<script src="gitbook/gitbook-plugin-fontsettings/fontsettings.js"></script>
</body>
</html>
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。