GCD全稱為Grand Central Dispatch 在IOS4才開始,用來實現多線程。它是IOS多線程抽象層次最高的一層,下面還有更加輕量級的Cocoa operations,和Thread。
當看到GCD的使用我仿佛看到了Android中的Handler和AsynTask。
- 在主線程中任意方法中加入:
-
- dispatch_async(dispatch_get_gloabal_queue(0, 0), ^{
- //加入耗時操作
- //......
- dispatch_async(dispatch_get_main_queue(), ^{
- //更新UI操作
- //.....
- });
-
- });
-
- 是否看到Android中Handler的影子? 首先需要在主線程中定義
- private Handler mHandler = new Handler();
- 然後在子線程中使用
- mHandler.post(){
- public void run() {
- //更新UI操作
- }
- }
-
- 或者是:
- 在主線程中:
- private Handler mHandler = new Handler() {
- public void handleMessage(Message msg) {
- switch(msg.what) {
- case 1:
- ....
- break;
- }
- }
-
- };
- 在子線程中:
- Message message = new Message();
- message.what = 1;
- mHandler.sendMessage(message);
dispatch_async(dispatch_get_main_queue(), ^{.....});的作用是將代碼塊中的工作轉回到主線程。
並發操作:有很多沒有關聯的耗時操作我們可以考慮使用並發操作。GCD提供實現並發操作的方法
- //因為不知是哪個線程先返回,www.linuxidc.com 故使用__block修飾變量來保存執行結果,確保在子線程中程序塊內設置的值可供在以後得代碼中使用。retain,是為了防止到程序最後變量已被釋放,那就是白忙活了
- __block NSString *firstResult;
- __block NSString *secondResult;
-
- //分發線程執行操作
- dispatch_group_async(group, dispatch_get_gloabal_queue(0, 0), ^{
- firstResult = [[ ...] retain];
- });
-
- //分發線程執行操作
- dispatch_group_async(group, dispatch_get_gloabal_queue(0, 0), ^{
- secondResult = [[ ...] retain];
- });
-
- //該程序塊在組中所有程序塊即將執行完時執行
- dispatch_group_notify(group, dispatch_get_gloabal_queue(0, 0), ^{
- //....
- dispatch_async(dispatch_get_main_queue(), ^{
- //更新UI操作
- //.....
- });
- });
在上面的代碼中是否看到了Android中AsyncTask的影子?
doInBackground(...){...}
onPostExecute(....){...}