iOS 之 多线程(一)

705 阅读1分钟

Swift 中的多线程

  • Thread

  • Cocoa Operation (Operation 和 OperationQueue)

    • 面向对象
    • 取消, 依赖, 任务优先级,复杂逻辑,保存业务状态,子类化
  • Grand Central Dispath (GCD)

Thread

  • 轻量级

  • 需要自己管理线程的声明周期和线程同步

快捷方式创建

  • detachNewThread(_ block: @escaping() -> void)
    • 输入一个逃逸闭包,可以稍后执行
  • detachNewThreadSelector(_ selector: Selector, toTarget target: Any, with argument: Any? )

初始化器

  • Thread(target:, selector:, object:)
  • 需要手动start线程
for i in 0..<10 {
    Thread.detachNewThread {
        print(i)
    }
}

class ObjectThread {
    func threadTest() {
        let thread = Thread(target: self, selector: #selector(threadWorker), object: nil)
        
        thread.start()
    }
    @objc func threadWorker() {
        print("threadWorker")
    }
}

let obj = ObjectThread()
obj.threadTest()

Operation

  • Operation
    • 状态
      • isReady, isExecuting, isFinished, isCancelled
    • sysc
      • main()
    • async
      • start() -> isAsynchronous -> isEexcuting -> isFinished
      • AfNetWorking
    • 添加和移除依赖
  • OperationQueue
    • 线程池,可将Opeartion添加到队列中
    • 底层使用GCD
    • maxConcurrentOperationCount 可以设置最大并发数
    • defaultMaxConcurrentOperationCount根据当前系统条件动态确定的最大并发数
    • 可以取消所以Operation,但是目前正在执行的不会取消
    • 所以Operation执行完毕后退出销毁
  • BlockOperation
        class ObjectOperation {
            func test()  {
                let operation = BlockOperation { [weak self] in
                    self?.threadWorker()
                }
    
                let queue = OperationQueue()
                queue.addOperation(operation)
            }
    
            @objc func threadWorker() {
                sleep(1)
                print("threadWorker")
            }
        }
    
        let obj = ObjectOperation()
        obj.test()
        print("after invoke test")
    
  • 继承Operation
    class ObjectOperation {
        func test()  {
            let operation = MyOperation()
    
            let queue = OperationQueue()
            queue.addOperation(operation)
        }
    
        @objc func threadWorker() {
            sleep(1)
            print("threadWorker")
        }
    }
    
    
    class MyOperation: Operation {
        override func main() {
            sleep(1)
            print("in MyOperation main")
        }
    }
    
    let obj = ObjectOperation()
    obj.test()
    print("after invoke test")
    
    
  • Operation 完成的回调
    • completionBlock
    class ObjectOperation {
        func test()  {
            let operation = MyOperation()
            operation.completionBlock = { () -> Void in
                print("completionBlock")
            }
            let queue = OperationQueue()
            queue.addOperation(operation)
        }
    
        @objc func threadWorker() {
            sleep(1)
            print("threadWorker")
        }
    }
    
    
    class MyOperation: Operation {
        override func main() {
            sleep(1)
            print("in MyOperation main")
        }
    }
    
    let obj = ObjectOperation()
    obj.test()
    print("after invoke test")