bigbro

秘密基地,记录成长

秘密基地


hello, 我是王岩,人称大师兄(bigbro),一名iOS客户端开发小白,正在努力成为大神的路上

Tiercel源码学习——并行下载器的典型实现

总体框架

UML

  • Manger是核心类,是功能接口类,提供对外和对内的API,负责任务的管理(新增、开始、暂停、取消、状态维护、并发控制、查询);session的管理(创建、reset、销毁)
  • Cache负责缓存相关的工作,包括任务信息的缓存(1以pilist文件的形式保存执行中任务的元数据)、本地下载目录的维护
  • DownLoadTask是执行下载任务的实体,维护下载任务相关的描述信息,进度、下载速度、起止时间、下载URL
  • SessionDelegate实现了URLSessionDataDelegate、URLSessionTaskDelegate的委托协议,由manager管理,并持有manager,在协议的回调中,通过manager找到相应的task,调用task中处理回调的方法

细节学习

  • Swift中命名空间的实现
    • 简书
    • 代码说话,定义名为wy的命名空间;通过协议来划分命名空间,只有遵循协议的类才拥有该命名空间

public final class WYKit<Base> {
    
    public let base: Base
    
    init(_ base: Base) {
        
        self.base = base
    }
}

// 定义命名空间的协议
public protocol WYKitCompatible {
    
    associatedtype CompatibleType
    
    var wy: CompatibleType { get }
}
// 扩展协议,给出命名空间变量的默认实现
extension WYKitCompatible {
    
    public var wy: WYKit<Self> {
        
        get {
            
            return WYKit(self)
        }
    }
}

// 扩展String实现命名空间wy
extension String: WYKitCompatible{ }

// String中命名空间wy下的函数
extension WYKit where Base == String {
    
    public func test() -> Base {
        
        return base + " test"
    }
}

  • 创建DispatchQueue队列,将操作磁盘文件的操作,根据需求在队里中同步或者异步执行,提高性能
  • 将重要Delegate(URLSessionDataDelegate、URLSessionTaskDelegate)的实现作为单独的类抽出来,使得代码直观简洁并且解耦
  • 可以通过创建DispatchQueue,并且在Queue中同步的执行某些字段的读写操作,简单的实现互斥资源的同步访问的控制;串行队列通常用来set和get属性的值,避免race conditions
      private let internalQueue = DispatchQueue(label:"com.XXX.internal")
      private var internalName: String = ""
      private var name: String {
          get {
              return internalQueue.sync { internalName }
          }
          set (newName) {
              internalQueue.sync { internalName = newName }
          }
      }   
    
最近的文章

iOS Rendering Process

UIKit自身不具备在屏幕成像的能力,主要负责对用户操作时间的响应 由UIView组成的是视图树,由CALayer组成的是图层树 视图的职责就是创建并管理这个图层,以确保当子视图在层级关系中添加或者被移除的时候,他们关联的图层也同样对应在层级关系树当中有相同的操作。 Core Animation 是从Layer Kit演变而来的,所以做动画仅仅是 Core Animation 特性的冰山一角 Core Animation 本质上可以理解为是一个复合引擎,旨在尽可能快的组合屏幕上...…

读博笔记、性能优化继续阅读
更早的文章

自定义ViewController转场动画

Step.1 创建UINavigationControllerDelegate的代理实现类 Step.2 实现func navigationController(_ navigationController: UINavigationController, animationControllerFor operation: UINavigationControllerOperation, from fromVC: UIViewController, to toVC: UIViewCo...…

日常继续阅读