网络优化

要点

  • 默认URLSession最大并发数量为4,根据实际需求调整,短时间有大量请求时,更大的并发可以节约等待时间,但是需要考虑回调后,解析数据、操作缓存、UI等并发造成的阻塞,极端情况下,还需要考虑网络带宽。
  • 对不同的类型请求,建议放到不同session队列中,注意避免平均耗时长的阻塞平均耗时短的请求,使得请求时间过长,操作不能及时响应。
  • 根据实际情况,撤销不需要的请求中和排队的请求,有利于节省后面的排队请求。

先说一下实际的场景, App结构如下!

左图点击一个文件夹进入中图
中图橙色部分是一个横放的collection, 兰色也是横向滚动的collection,黄色仍然是横向滚动的collection
灰色是黄色collection的一个cell
然后灰色的cell中有一个纵向滚动的collection(是不是已经晕了)

整个App的数据是一个树形结构

  o     o  ......首页
 /|\   / \
o o o o   o  ... 仪表盘
/\   \
o o   o ........ 子仪表盘

首页处于第一层,中图可以是任意一个节点o
点击橙色进入任意一个直接点
点击红色按钮下拉张抗数接口,可以快速跳转任意节点
所有的操作只更图二的view model,而非跳转页面
图二根据当前节点的数据情况,会自动动画显示或隐藏橙色、兰色的高度,以及右上方截图等,并自动放当前cell(灰色)请求网络或读缓存,解析数据,绘图,显示...

控制并发

session.config.httpMaximumConnectionsPerHost = 8
for _ in 0..<8 {
    Network.download(session, url:url, success(data){}, fail(error){})
}

按Session分组

Network.download(downloadSession, url, success(data) {} fail(error){})
Network.post(infoSession, url:url, parameters:parameters, success(data){} fail(error){})
Network.get(shareSession, url:url, success(data){}, fail(error){})

撤销任务

在网络层,把所有的请求任务加到pool中,然后在回调中把完成的任务移除,这样pool中的task中的任务都是请求中的。

dataTask = generateDataTask^ success {
    taskPool.removedataTask)
} fail(error) ^ {
    taskPool.remove(dataTask)
    if (error.code == calcled || retryTimes <= 0) {
        fail()
    } else {
        retryRequest()
    }
}
taskPool.add(dataTask)
taskPool.emnuw(obj) {
    obj.cancle
}

results matching ""

    No results matching ""