背景
前不久项目上一段代码出现 crash,因为 dispatch_once 出现死锁问题
HTTP/HTTPS 可以通过 HTTP Response 中的 header 字段(如 Cache-Control
、Expires
、Last-Modified
)告诉 client 是否需要对 response 进行缓存。有未过期的缓存,客户端可以使用缓存避免冗余的网络请求。
接下来探讨几个问题:
HTTP 协议如何利用 header 控制缓存的?
iOS(URLSession)对于非幂等的网络请求是否也支持本地缓存(如 POST)? 疑问来自于 rfc2616
Responses to this method are not cacheable, unless the response
includes appropriate Cache-Control or Expires header fields. However,
the 303 (See Other) response can be used to direct the user agent to
retrieve a cacheable resource.
IGListKit 是 Instagram 维护一个 UI 框架,采用面向协议的思想,基于 UICollectionView 实现,由数据驱动的 UI 列表框架。本文基于 IGListKit 源码对其主要设计思想进行分析。
在 Objective-C 语言中,对象/类(其实类也是一个对象) 执行方法最后会转化成给对象发送消息:
objc_msgSend(receiver, @selector(message))
如果 reveiver
中没有找到对应方法 message
, 则会开始消息转发的过程,也就是过程:
接下来通过OC的源码来分析以上几个步骤具体的调用过程
此篇文章是学习分析 objc-msg-arm64.s 源码过程中需要用到的汇编知识的一点记录
之前分析过 RACSignal,数据流向是单向而且是1对1的,如果想使用双向绑定的效果,可以使用 ReactiveCocoa 框架中提供的 RACChannel;接来下分析 RACChannel 底层的实现原理。
RACScheduler
ReactiveCocoa 框架中的调度器,ReactiveCocoa 中的信号可以在 RACScheduler
上执行任务、发送结果; RACScheduler
的实现主要是基于 GCD 封装,提供了 GCD 不具备的特性。
在项目中,经常会把用户操作动作和业务操作进行绑定,比如点击登录按钮会进行登录网络请求、点击下载图片等等。ReactiveCocoa 中提供捆绑副作用和信号的 RACCommand,开发者可以利用 RACCommand 来实现类似这种 动作-响应 绑定的功能。