由于swift3.0 中已经删除了dispatch_one 这种OC 中的写法,至于为什么 ? 因为 static var背后已经在使用dispatch_once了,所以从Swift 3.0开始,就干脆把dispatch_once显式的取消了。
1.至于swift中的单例应该怎么写呢,我这里大胆分享其中一种
final class myInstance: NSObject {
static let shared = myInstance()
private override init() {}
}
2.如果一大堆任务执行着的时候,突然后面的任务不想执行的。那怎么办呐?我们可以让它暂时先挂起,等想好了再让它们运行起来。
func useDispatchSuspend(_ sender: Any) {
let queue = DispatchQueue(label: "new thread")
// 挂起
queue.suspend()
queue.async {
print("The queue is suspended. Now it has completed.\n The queue is \"\(queue.label)\". ")
}
print("The thread will sleep for 3 seconds' time")
DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + DispatchTimeInterval.seconds(3)) {
// 唤醒,开始执行
queue.resume()
}
}
3.信号量
//创建一个信号量,初始值为1
let semaphoreSignal = DispatchSemaphore(value: 1)
//表示信号量-1
semaphoreSignal.wait()
//表示信号量+1
semaphoreSignal.signal()
func useSemaphore(_ sender: Any) {
let semaphoreSignal = DispatchSemaphore(value: 1)
for index in 1...5 {
DispatchQueue.global().async {
semaphoreSignal.wait()
print(Thread.current)
print("这是第\(index)次执行.\n")
semaphoreSignal.signal()
}
print("测试打印")
}
}
4.多个线程之间进行任务协调
semaphoreDemo() -> Void {
let sema = DispatchSemaphore.init(value: 0)
getListData { (result) in
if result == true {
sema.signal()
}
}
sema.wait()
print("我终于可以开始干活了")
}
private func getListData(isFinish:@escaping (Bool) -> ()) {
DispatchQueue.global().async {
Thread.sleep(forTimeInterval: 1)
print("global queue has completed!")
isFinish(true)
}
}
- 任务组
/1.自动关联
@IBAction func useGroupQueue(_ sender: UIButton) {
let group = DispatchGroup()
//模拟循环建立几个全局队列
for index in 0...3 {
//创建队列的同时,加入到任务组中
DispatchQueue.global().async(group: group, execute: DispatchWorkItem.init(block: {
Thread.sleep(forTimeInterval: TimeInterval(arc4random_uniform(2) + 1))
print("任务\(index)执行完毕")
}))
}
//组中所有任务都执行完了会发送通知
group.notify(queue: DispatchQueue.main) {
print("任务组的任务都已经执行完毕啦!")
}
print("打印测试一下")
}
/2.手动关联
enter(),leave()是一对儿。前者表示进入到任务组。后者表示离开任务组。
let manualGroup = DispatchGroup()
//模拟循环建立几个全局队列
for manualIndex in 0...3 {
//进入队列管理
manualGroup.enter()
DispatchQueue.global().async {
//让线程随机休息几秒钟
Thread.sleep(forTimeInterval: TimeInterval(arc4random_uniform(2) + 1))
print("-----手动任务\(manualIndex)执行完毕")
//配置完队列之后,离开队列管理
manualGroup.leave()
}
}
//发送通知
manualGroup.notify(queue: DispatchQueue.main) {
print("手动任务组的任务都已经执行完毕啦!")
}