GCDQueue封装

本文介绍了如何通过自定义的GCDQueue类来创建一个同步串行任务队列,该队列结合了GCD和链表数据结构,支持添加任务并按顺序执行。任务执行通过重写doTask方法实现,确保任务按添加顺序逐个执行。示例代码展示了如何创建队列、添加任务以及执行任务,输出结果显示任务按预期顺序执行。
摘要由CSDN通过智能技术生成

1. DispatchQueue其实是一个抽象的概念,并非数据结构中的队列

  • 需求:要创建一个队列,添加同步串行任务

  • 代码封装:

class GCDQueue: NSObject {
    var syncQueue: DispatchQueue?
    var head: SingalLinkList = SingalLinkList()
    var count: Int = 0
    let lock: NSLock = NSLock()
    
    init(_ queueLabel: String) {
        syncQueue = DispatchQueue(label: queueLabel)
    }
    
    public func clear() {
        count = 0
        head.next = nil
    }
    
    public func getNode(index: Int) -> SingalLinkList? {
        var curIndex = index
        checkIndex(index: &curIndex)
        
        var node = head.next
        for _ in 0..<index {
            node = node?.next
        }
        
        return node
    }
    
    public func add<T>(task: T, _ index: Int = -1) {
        lock.lock()
        
        var curIndex = index == -1 ? count : index
        checkIndex(index: &curIndex)
        
        if count == 0 {
            head.next = SingalLinkList(ele: task, nextL: nil)
        } else {
            let pre = getNode(index: curIndex - 1)
            let node = getNode(index: curIndex)
            pre?.next = SingalLinkList(ele: task, nextL: node)
        }
        
        count += 1
        lock.unlock()
    }
    
    
    public func doTask() {
        // 实现子类
    }
    
    private func checkIndex(index: inout Int) {
        if index < 0 || index > count {
            print("下标越界,放到最后去")
            index = count
        }
    }
}

class SingalLinkList {
    var next: SingalLinkList?
    var element: AnyObject?
     
    init() {
        element = nil
        next = nil
    }
    init<T>(ele: T?, nextL: SingalLinkList?) {
        element = ele as AnyObject
        next = nextL
    }
}
  • 任务具体要做到事情,需要继承GCDQueue,重写doTask方法
class taskQueue: GCDQueue {
    override func doTask() {
        if count == 0 {
            return
        }
        guard let temp = head.next?.element as? testTask else {
            return
        }
        
        print("doTask--",temp.val)
        
        count -= 1
        let node = head.next?.next
        head.next = node
        
        doTask()
    }
}
  • 使用案例
class ViewController: UIViewController {

    var queue: taskQueue = taskQueue("testQueue")
    
    override func viewDidLoad() {
        super.viewDidLoad()
		
        for i in 0..<5 {
            let task = testTask(value: i)
            queue.add(task: task)
            
        }
        let temp = testTask(value: 100)
        queue.add(task: temp, 9)
        
        queue.doTask()
    } 
}
  • 打印结果

doTask-- 0
doTask-- 1
doTask-- 2
doTask-- 100
doTask-- 3
doTask-- 4

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值