GCD系列 一 使用DispatchWorkItem (3)

DispatchWorkItem

DispatchWorkItem是封装work的对象,可以监听work完成的通知,并指定和其他DispatchWorkItem之间的依赖关系。

A DispatchWorkItem encapsulates work to be performed on a dispatch queue or within a dispatch group. You can also use a work item as a DispatchSource event, registration, or cancellation handler.

DispatchWorkItem结构

DispatchWorkItem 是一个Class, 含有一个 实例变量表示任务是否被取消

var isCancelled: Bool

同时,你可以调用 DispatchWorkItem 的取消方法

func cancel()
Cancels the current work item asynchronously.
  • 如果任务放入队列中,在任务执行之前调用了cancel(), 那么这个任务将不会被Queue执行
  • 如果任务已经在执行中了, 调用了cancel(), 那么将直接终止任务的执行

DispatchWorkItem 实践

  • 异步执行work
let work1 = DispatchWorkItem {
    print("Simple Pure Work")
}
DispatchQueue.global().async(execute: work1)
  • 同步执行work
let work1 = DispatchWorkItem {
   print("Simple Pure Work")
}
DispatchQueue.global().sync(execute: work1)
  • 创建带QoS的workItem
let work2 = DispatchWorkItem(qos: .background) {
    print("Work background")
}

let work3 = DispatchWorkItem(qos: .userInteractive) {
    print("Work userInteractive")
}

DispatchQueue.global().async(execute: work2)
DispatchQueue.global().async(execute: work3)

work3将先执行

  • 创建带Flags的workItem, barrier表示作为屏障,在此之前的work必须先执行完后,当前work才开始执行;只有当当前work结束后,后续提交的work才能够继续执行
  • 注意,如果这里的queue是global队列,将无法达到效果
let work2 = DispatchWorkItem(qos: .default, flags: .enforceQoS) {
    print("work2")
}

let work3 = DispatchWorkItem(qos: .default, flags: .barrier) {
    Thread.sleep(forTimeInterval: 3)
    print("work3")
}
let work4 = DispatchWorkItem(qos: .default) {
    print("work4")
}

let q = DispatchQueue(label: "concurrent", attributes: .concurrent)
q.async(execute: work2)
q.async(execute: work3)
q.async(execute: work4)
  • 创建带Flags的workItem
/*
 public static let barrier: DispatchWorkItemFlags

 @available(macOS 10.10, iOS 8.0, *)
 public static let detached: DispatchWorkItemFlags

 @available(macOS 10.10, iOS 8.0, *)
 public static let assignCurrentContext: DispatchWorkItemFlags

 @available(macOS 10.10, iOS 8.0, *)
 public static let noQoS: DispatchWorkItemFlags

 @available(macOS 10.10, iOS 8.0, *)
 public static let inheritQoS: DispatchWorkItemFlags

 @available(macOS 10.10, iOS 8.0, *)
 public static let enforceQoS: DispatchWorkItemFlags
 */
/// 强制使用当前work的QoS
let work2 = DispatchWorkItem(qos: .default, flags: .enforceQoS) {
    print("work2")
}
/// inheritQoS 继承队列的QoS
let work3 = DispatchWorkItem(qos: .default, flags: .inheritQoS) {
    Thread.sleep(forTimeInterval: 3)
    print("work3")
}
/// work执行的时候使用当前的上下文?(具体有点不清晰)
let work4 = DispatchWorkItem(qos: .default, flags: .assignCurrentContext) {
    print("work4")
}

let q = DispatchQueue(label: "concurrent", attributes: .concurrent)
q.async(execute: work2)
q.async(execute: work3)
q.async(execute: work4)
  • WorkItem之间的同步,下面的两个任务将等待第一个任务5s后执行完才执行
let work = DispatchWorkItem {
    print("work start")
    Thread.sleep(forTimeInterval: 5)
}
work.notify(queue: .main) {
    print("work done")
}
work.notify(queue: .global(), execute: DispatchWorkItem(block: {
    print("work item done")
}))
DispatchQueue.global().async(execute: work)
  • wait方法
let queue = DispatchQueue(label: "queue", attributes: .concurrent)
let workItem = DispatchWorkItem {
    sleep(3)
    print("done")
}
    
queue.async(execute: workItem)
print("before waiting")
workItem.wait()
print("after waiting")
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值