前言

最近一段时间公司的 APP 在某个时间段比较多人访问时,经常出现连接不上服务器的情况,刚开始我们一直都以为是服务器问题,运维同事做了一些措施还是不能解决。

后来在使用 Charles 抓包时,看到每次的接口请求,Keep-Alive 都是不生效的。

猜测是因为这里导致用户发起的每个请求,都要重新进行 DNS 解析、建立 SSL 握手等操作(尤其我们首页每次刷新还都会同时发起好几个请求…)。

而我们 DNS 用的貌似是第三方的服务,所以问题比较大可能是出在跟我们服务器的握手阶段(为了方便定位是什么问题,我在一个版本中,加入了错误码的提示,发现很多是超时、握手失败等情况)。

当很多人同时访问时,由于前面有大量握手(我们用的是 HTTPS,报文会比 HTTP 多一些)没建立成功,服务器还在忙着处理,后面的请求就处理不过来了,所以就阻塞了。

那应该如何解决呢?

阅读全文 »

前言

我们知道,在 block 里面能读取外部变量,但是如果需要修改外部变量的值,需要给变量加上 __block 修饰符才行。

接下来让我们带着2个问题来研究一下:

  1. 为什么不加 __block 就只能读取,不能修改(即:block 的实现,是怎么达到不能修改的)
  2. 加了 __block 为什么就能修改
阅读全文 »

前言

iOS 中,类簇的使用是比较普遍的,如 NSNumberNSArrayNSString 等,属于 抽象工厂 模式的一种应用,隐藏了具体的实现类,只暴露出简单的接口。

阅读全文 »