同样的,属于个人笔记,代码简单不过多赘述,该有的解释都在注释里
1、首先简单地用代码描述一下多线程三种方式的用法。
- GCD
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)) { () -> Void in
//所有耗时操作放在该处处理
self.sendData()
dispatch_async(dispatch_get_main_queue(), { () -> Void in
//耗时操作执行完成,通知主线程更新UI
self.updateUI()
})
}
- NSThread
NSThread.detachNewThreadSelector("sendData", toTarget: self, withObject: nil)
- NSOperationQueue
let myOperation = NSBlockOperation { () -> Void in
self.sendData()
}
NSOperationQueue().addOperation(myOperation)
//sendData函数
func sendData() {
//模拟5秒的网络请求
sleep(5)
//NSOpereationQueue方式 和 NSThread方式调用该函数更新UI
//dispatch_async(dispatch_get_main_queue()) { () -> Void in
// self.updateUI()
//}
}
2、重点:
CGD队列有三种
- 主队列
dispatch_get_main_queue()
-
全局队列
dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)
-
自定义队列
/**
*DISPATCH_QUEUE_CONCURRENT 并行
*DISPATCH_QUEUE_SERIAL 串行
*/
let myQueue = dispatch_queue_create("com.crazymouse.thread", DISPATCH_QUEUE_CONCURRENT)
dispatch_async(myQueue) { () -> Void in
self.sendData()
}
3、GCD相关使用
- 延时
/**
*从现在开始,延时两秒
*DISPATCH_TIME_NOW 从现在开始
*NSEC_PER_SEC 先死记这样写吧
*/
let myTime = dispatch_time(DISPATCH_TIME_NOW, (Int64)(NSEC_PER_SEC * 2))
dispatch_after(myTime, dispatch_get_main_queue()) { () -> Void in
}
- 重复 运用�场景:重复次数不多且耗时操作,否则不如用for循环
//该函数为同步,使用时最好放在异步队列里
//重复三次
dispatch_apply(3, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)) { (index: Int) -> Void in
print(index)
}
- GCD调度 有时候有几个请求同时进行,而后续操作需要等请求全部完成才继续进行,比如请求图片,将图片全部请求完成之后,提示请求完成,就需要用到GCD调度了。 很简单:
//1、创建一个队列
let myQueue = dispatch_queue_create("com.crazymouse.thread", DISPATCH_QUEUE_CONCURRENT)
//2、创建一个组
let myGroup = dispatch_group_create()
//3、将队列都放进组里
dispatch_group_async(myGroup, myQueue) { () -> Void in
//请求操作1
...
dispatch_async(dispatch_get_main_queue(), { () -> Void in
//通知UI线程更新UI
...
})
}
dispatch_group_async(myGroup, myQueue) { () -> Void in
//请求操作2
...
dispatch_async(dispatch_get_main_queue(), { () -> Void in
//通知UI线程更新UI
...
})
}
//4、提示请求完成
dispatch_group_notify(myGroup, dispatch_get_main_queue()) { () -> Void in
//通知主线程请求完成
...
}
网友评论