SwiftNIO 还提供了一些 Channel,预加载和图片正常显示会自动合并动图支持支持多图动态播放

摘要来自谷歌官方博客的最新消息显示,谷歌今日宣布,今年7月起,Chrome浏览器的地址栏将把所有HTTP标示为不安全网站。这是谷歌浏览器针对HTTP网站开战的第三步棋。前言来自谷歌官方博客的最新消息显示,谷歌今日宣布,今年7月起,Chrome浏览器的地址栏将把所有HTTP标示为不安全网站。这是谷歌浏览器针对HTTP网站开战的第三步棋。正言HTTPS是HTTP协议的升级版本,更为安全可靠。互联网用户和网站之间的安全连接协议被视为减少用户风险的必要措施,否则用户可能遭受窃听、中间人攻击或数据篡改。数年来,谷歌一直力推HTTPS协议,去年它更是加快推进速度,对Chrome的用户界面做出了一些改变。2017年1月发布的Chrome
56浏览器开始把收集密码或信用卡数据的HTTP页面标记为“不安全”。若用户使用2017年10月推出的Chrome
62,带有输入数据的HTTP页面和所有以无痕模式浏览的HTTP页面都会被标记为“不安全”。这些措施的成效很明显。谷歌和Mac生态系统中,Chrome浏览器超过78%的流量都在使用HTTPS。而Android和Windows生态系统中,Chrome的68%流量来自HTTPS。但谷歌还未止步。谷歌的理由Chrome新界面将帮助用户了解所有的HTTP网站都是不安全的,从而采用安全的HTTPS网站。HTTPS比以往任何时候都更便利、更便宜,它带来了性能提升和强大的新功能,这些都是HTTP所没有的。Chrome目前以黑色字体标示“不安全”字样,最终谷歌会把“不安全”标为红色,并在旁边添加表示警告的红图标,为的是进一步强调HTTP网站不应被信任。谷歌也公开了最新版本的Lighthouse,这是一种自动化的网站性能评测工具,可提供内容审查功能来帮助开发者转移至HTTPS网站。这一新工具会向开发者显示哪些网站来源在使用HTTP,哪些网站仅仅通过改变子资源参考就可以升级到HTTPS版本。业内动态近年来,已经有越来越多的第三方服务开始推荐甚至是强制要求使用HTTPS连接方式,比如现在用得特别多的微信登录、微信支付、短信验证码、地图
API 等等,又比如苹果公司 2016
年在WWDC上宣称,公司希望官方应用商店中的所有 iOS App 都使用安全的 HTTPS
链接与服务器进行通信,并表示 2017 年 1 月 1 日起,苹果 App Store
中的所有 App 都必须启用 ATS
安全功能——虽然后续因为一些未知原因而暂缓了,但这也传递了一种信号:越来越多的第三方服务下,在不久的将来可能都会强制要求使用HTTPS协议,这只是时间问题而已。那为什么越来越多的HTTP
都在逐渐HTTPS 化?HTTP 协议(超文本传输协议)是客户端浏览器或其他程序与
Web 服务器之间的应用层通信协议;HTTPS 协议可以理解为 HTTP+SSL/TLS, 即
HTTP 下加入 SSL 层,HTTPS 的安全基础是 SSL,因此加密的详细内容就需要
SSL,用于安全的 HTTP 数据传输。诚然,HTTP
具有高效便捷的优势,但也面临着窃听、篡改、冒充等传输风险,相比之下,HTTPS
协议增加了很多握手、加密解密等流程,虽然过程很复杂,但其可以保证数据传输的安全,所以在这个互联网快速迭代的时代下,HTTPS
越来越受追捧。谷歌作为科技巨头之一,在这一方面也不例外。为了保证数据安全,谷歌很早就启用了HTTPS
协议,并且近年来动作不断。2017 年 1 月,Chrome
56就开始突出标记一些涉及密码、信用卡及其他敏感信息的不安全 HTTP
站点;2017 年 10 月,Chrome 62 又开始标记一些带有输入数据的 HTTP
页面和所有以无痕模式浏览的 HTTP
页面。谷歌的这些措施也确实卓有成效,在谷歌和 Mac 生态系统中,Chrome
浏览器超过 78% 的流量都在使用 HTTPS;在 Android 和 Windows
生态系统中,Chrome的 68% 流量也来自 HTTPS;此外,前 100 名的网站中有 81
个都在默认使用 HTTPS,绝大多数 Chrome
流量都已加密。此次谷歌发布的最新博客消息,是其大力推行 HTTPS
的又一动作:计划在今年 7 月发布的 Chrome 68版本上标记所有的 HTTP
页面,也就意味着谷歌将启用全站
HTTPS,并且计划在地址栏中显示如下内容:Chrome 安全产品经理 Emily
Schechter在博客中同样还提到了,“根据网站已经转移到 HTTPS
的速度以及今年的强劲走势,我们认为 7 月份将足够让我们可以标记所有的
HTTP站点”。事实上,除去谷歌,其他一些互联网公司也进行了自己的HTTPS
实现,比如当前国内炒的很火热的微信小程序也要求必须使用 HTTPS
协议;新一代 HTTP/2 协议的支持必须以 HTTPS
为基础等等。因此想必在不久的将来,全网 HTTPS 势在必行。

摘要近日,苹果开源了一款基于事件驱动的高性能跨平台网络应用程序开发框架
SwfitNIO,它有点类似 Netty,但开发语言使用的是
Swift。1、SwiftNIO是什么SwfitNIO
实际上是一个底层工具,用于开发高性能的网络应用程序,作为“每连接一个线程”的替代方案。为了提升性能,SwfitNIO
使用了非阻塞 IO,这从它的名字就可以看出来。非阻塞 IO 与阻塞式 IO
非常不一样,因为不管是往网络上发送数据还是从网络上接收数据,应用程序都无需等待,系统内核会在有可操作的
IO 时通知 SwfitNIO。SwfitNIO 并不会提供类似 Web
框架那样的解决方案,而是致力于为上层框架提供底层的构建块。在开发 Web
应用程序时,大部分开发者不会直接使用 SwfitNIO,他们会从 Swift
生态系统众多的 Web 框架中选择一个。不过,这些框架中的大部分都使用了
SwfitNIO。2、受支持的平台SwfitNIO 的目标是支持所有可以运行 Swift
的平台。目前,SwfitNIO 可以在 macOS 和 Linux 上运行,包括:Ubuntu
14.04+macOS 10.12+3、基本架构SwfitNIO 包含了几种基本构建块,所有的
SwfitNIO
应用程序都是由这几种组件组成的。EventLoopGroupEventLoopChannelChannelHandlerBootstrapByteBuffer▶
EventLoopPromise 和 EventLoopFutureEventLoop 是 SwfitNIO 最基本的 IO
原语,它等待事件的发生,在发生事件时触发某种回调操作。在大部分 SwfitNIO
应用程序中,EventLoop 对象的数量并不多,通常每个 CPU 核数对应一到两个
EventLoop 对象。一般来说,EventLoop
会在应用程序的整个生命周期中存在,进行无限的事件分发。EventLoop
可以组合成 EventLoopGroup,EventLoopGroup 提供了一种机制用于在各个
EventLoop 间分发工作负载。例如,服务器在监听外部连接时,用于监听连接的
socket 会被注册到一个 EventLoop 上。但我们不希望这个 EventLoop
承担所有的连接负载,那么就可以通过 EventLoopGroup 在多个 EventLoop
间分摊连接负载。目前,SwiftNIO 提供了一个 EventLoopGroup
实现(MultiThreadedEventLoopGroup)和两个 EventLoop
实现(SelectableEventLoop 和
EmbeddedEventLoop)。MultiThreadedEventLoopGroup 会创建多个线程(使用
POSIX 的 pthreads 库),并为每个线程分配一个 SelectableEventLoop
对象。SelectableEventLoop 使用选择器(基于 kqueue 或
epoll)来管理来自文件和网络 IO 事件。EmbeddedEventLoop 是一个空的
EventLoop,什么事也不做,主要用于测试。▶
Channels、ChannelHandler、ChannelPipeline 和 ChannelHandlerContext尽管
EventLoop
非常重要,但大部分开发者并不会与它有太多的交互,最多就是用它创建
EventLoopPromise 和调度作业。开发者经常用到的是 Channel 和
ChannelHandler。每个文件描述符对应一个 Channel,Channel
负责管理文件描述符的生命周期,并处理发生在文件描述符上的事件:每当
EventLoop 检测到一个与相应的文件描述符相关的事件,就会通知
Channel。ChannelPipeline 由一系列 ChannelHandler 组成,ChannelHandler
负责按顺序处理 Channel 中的事件。ChannelPipeline
就像数据处理管道一样,所以才有了这个名字。ChannelHandler 要么是
Inbound,要么是 Outbound,要么两者兼有。Inbound 的 ChannelHandler
负责处理“inbound”事件,例如从 socket 读取数据、关闭 socket
或者其他由远程发起的事件。Outbound 的 ChannelHandler
负责处理“outbound”事件,例如写数据、发起连接以及关闭本地
socket。ChannelHandler
按照一定顺序处理事件,例如,读取事件从管道的前面传到后面,而写入事件则从管道的后面传到前面。每个
ChannelHandler 都会在处理完一个事件后生成一个新的事件给下一个
ChannelHandler。ChannelHandler
是高度可重用的组件,所以尽可能设计得轻量级,每个 ChannelHandler
只处理一种数据转换,这样就可以灵活组合各种
ChannelHandler,提升代码的可重用性和封装性。我们可以通过
ChannelHandlerContext 来跟踪 ChannelHandler 在 ChannelPipeline
中的位置。ChannelHandlerContext 包含了当前 ChannelHandler
到上一个和下一个 ChannelHandler 的引用,因此,在任何时候,只要
ChannelHandler 还在管道当中,就能触发新事件。SwiftNIO 内置了多种
ChannelHandler,包括 HTTP 解析器。另外,SwiftNIO 还提供了一些 Channel
实现,比如 ServerSocketChannel(用于接收连接)、SocketChannel(用于 TCP
连接)、DatagramChannel(用于 UDP socket)和
EmbeddedChannel(用于测试)。▶ BootstrapSwiftNIO 提供了一些 Bootstrap
对象,用于简化 Channel 的创建。有些 Bootstrap
对象还提供了其他的一些功能,比如支持 Happy Eyeballs。目前 SwiftNIO
提供了三种 Bootstrap:ServerBootstrap(用于监听
Channel),ClientBootstrap(用于 TCP Channel)和 DatagramBootstrap(用于
UDP Channel)。▶ ByteBufferSwiftNIO 提供了 ByteBuffer,一种快速的
Copy-On-Write 字节缓冲器,是大部分 SwiftNIO
应用程序的关键构建块。ByteBuffer
提供了很多有用的特性以及一些“钩子”,通过这些钩子,我们可以在“unsafe”的模式下使用
ByteBuffer。这种方式可以获得更好的性能,代价是应用程序有可能出现内存问题。在一般情况下,还是建议在安全模式下使用
ByteBuffer。▶ EventLoopPromise 和
EventLoopFuture并发代码和同步代码之间最主要的区别在于并非所有的动作都能够立即完成。例如,在向一个
Channel 写入数据时,EventLoop
有可能不会立即将数据冲刷到网络上。为此,SwiftNIO 提供了
EventLoopPromise和
EventLoopFuture,用于管理异步操作。EventLoopFuture实际上是一个容器,用于存放函数在未来某个时刻的返回值。每个
EventLoopFuture对象都有一个对应的
EventLoopPromise,用于存放实际的结果。只要 EventLoopPromise
执行成功,EventLoopFuture 也就完成了。通过轮询的方式检查 EventLoopFuture
是否完成是一种非常低效的方式,所以 EventLoopFuture
被设计成可以接收回调函数。也就是说,在有结果的时候回调函数会被执行。EventLoopFuture负责处理调度工作,确保回调函数是在最初创建
EventLoopPromise 的那个 EventLoop
上执行,所以就没有必要再针对回调函数做任何同步操作。4、SwiftNIO
的设计哲学SwiftNIO
的目标是要成为强大的网络应用程序开发框架,但并不想为所有的层次抽象提供完美的解决方案。SwiftNIO
主要专注在基本的 IO
原语和底层的协议实现上,将其他层次的抽象留给广大的社区去构建。SwiftNIO
将成为服务器端应用程序的构建块,但不一定就是应用程序直接拿来使用的框架。对性能有很高要求的应用程序可能会直接使用
SwiftNIO,减少上层抽象所带来的开销。SwiftNIO
可以帮助这些应用程序在提升性能的同时降低维护成本。SwiftNIO
还为某些场景提供了有用的抽象,高性能的网络服务器可以直接使用这些抽象。SwiftNIO
的核心仓库提供了一些非常重要的协议实现,比如
HTTP。不过,我们认为,大部分协议的实现应该要与底层的网络栈分开,因为它们的发布节奏是很不一样的。为此,我们鼓励社区自己去实现和维护他们的协议实现。实际上,SwiftNIO
提供的一些协议实现最初就是由社区开发的,比如 TLS 和
HTTP/2。5、相关资源源码托管:
文档:
SwiftNIO:聊天客户端:
客户端:
服务器端:
服务器:

摘要LKImageKit
是一个来自腾讯的高性能iOS平台图片框架,包括了图片控件,图片下载、内存缓存、磁盘缓存、图片解码、图片处理等一系列能力。合理的架构和线程模型,并特别针对不同场景进行优化,能充分发挥硬件的性能。基本介绍LKImageKit
是一个高性能的图片框架,包括了图片控件,图片下载、内存缓存、磁盘缓存、图片解码、图片处理等一系列能力。合理的架构和线程模型,并特别针对不同场景进行优化,能充分发挥硬件的性能。该框架具有高度的扩展性。在此框架下,开发者可以自定义图片框架中的任何一个部分,比如:自定义图片显示逻辑、自定义缓存、自定义下载组件、自定义解码器、自定义图片处理算法等等。该组件旨在提供
iOS
平台上使用最简单,功能最强大的高性能图片解决方案。组件特性提供演示视频和
DEMODEMO中演示了如何在图片墙场景的数千张图片下,配合预加载、优先级控制、分级加载等技术,实现图片在快速滑动场景的高速下载和显示模块插件化可定制缓存、解码、加载、绘制等多个模块支持取消不再显示的图片迅速取消请求,节约内存占用支持优先级、优先级可动态调整通过对不同区域优先级的设置,使页面加载获得更好的体验支持预加载可以预先加载图片,预加载和图片正常显示会自动合并动图支持支持多图动态播放,包括正向播放、逆向播放、来回播放等雪碧图支持提供将雪碧图解码成序列帧的能力滤镜支持支持在图片显示前异步对图片进行滤镜处理渐进式加载支持图片边下载边显示多级加载支持多级请求,比如先加载小图再加载大图后台解码使用后台线程解码,提升页面流畅度请求合并相同类型的请求会被合并,不会导致重复的运算和下载并发数控制可以分别对加载、解码、处理等多个模块进行分别并发控制API调用顺序无关无需考虑
API 调用顺序,并不需要将 setURL
作为发送请求的接口加载有多快,有图有真相!开源地址详见:

相关文章