DispatchQueue

  • DispatchQueue 分为串行和并发,它的完整初始化方法为:
    DispatchQueue.init(label: String, qos: DispatchQoS, attributes: DispatchQueue.Attributes, autoreleaseFrequency: DispatchQueue.AutoreleaseFrequency, target: DispatchQueue?)
    可见,这些参数中,除了label,其它都有默认值(label表示该队列的标签,建议传值为反向域名字符串,如:com.onevcat.Kingfisher.Animator.preloadQueue)。
    当除label外的参数都使用默认值时,初始化方法返回的便是串行队列。如果需要返回并发队列,参数attributes传值为.concurrent即可。DispatchQueue.Attributes 是一个结构体类型,该结构体提供了两个静态变量:concurrent和initiallyInactive(注意,没有代表串行队列的静态变量)。如果attributes参数传值为initiallyInactive, 任务不会自动执行,而是需要开发者手动调用activate()触发。但是代码依然是串行进行的,如果想要手动触发、并行执行任务,可以指定attributes参数接受一个数组: [.concurrent, .initiallyInactive]。
    DispatchQoS:是一个结构体 代表队列的优先级,有6中可选值.优先级从高到低依次为
         public static let userInteractive: DispatchQoS
         public static let userInitiated: DispatchQoS
         public static let utility: DispatchQoS
         public static let background: DispatchQoS
         //default和unspecified优先级介于userInteractive和background
         //之间,具体优先级有系统决定.
         public static let `default`: DispatchQoS
         public static let unspecified: DispatchQoS

DispatchQueue.AutoreleaseFrequency有三种属性值:.inherit、.workItem和.never。

  • .inherit:不确定,之前默认的行为也是现在的默认值
  • .workItem:为每个执行的任务创建自动释放池,项目完成时清理临时对象
  • .never:GCD不为您管理自动释放池
    参数target 用于指定即将创建的队列与队列target优先级相同。也可通过setTarget(queue: DispatchQueue?)函数指定与queue相同的优先级。
    除了开发者自己创建队列,还可以通过DispatchQueue.main获取主队列(主队列也属于串行队列)、DispatchQueue.global(qos: DispatchQoS.QoSClass) 获取全局并发队列。
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容