1、常用的方法dispatch_async
為了避免界面在處理耗時(shí)的操作時(shí)卡死,比如讀取網(wǎng)絡(luò)數(shù)據(jù),IO,數(shù)據(jù)庫(kù)讀寫(xiě)等,我們會(huì)在另外一個(gè)線程中處理這些操作,然后通知主線程更新界面。
用GCD實(shí)現(xiàn)這個(gè)流程的操作比前面介紹的NSThread? NSOperation的方法都要簡(jiǎn)單。代碼框架結(jié)構(gòu)如下:
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0),^{
// 耗時(shí)的操作
dispatch_async(dispatch_get_main_queue(),^{
// 更新界面
});
});
如果這樣還不清晰的話,那我們還是用上兩篇博客中的下載圖片為例子,代碼如下:
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0),^{
NSURL*url=[NSURLURLWithString:@"http://avatar.csdn.net/2/C/D/1_totogo2010.jpg"];
NSData*data=[[NSDataalloc]initWithContentsOfURL:url];
UIImage*image=[[UIImagealloc]initWithData:data];
if(data!=nil){
dispatch_async(dispatch_get_main_queue(),^{
self.imageView.image=image;
});
}
});
2、dispatch_group_async的使用
dispatch_group_async可以實(shí)現(xiàn)監(jiān)聽(tīng)一組任務(wù)是否完成,完成后得到通知執(zhí)行其他的操作。這個(gè)方法很有用,比如你執(zhí)行三個(gè)下載任務(wù),當(dāng)三個(gè)任務(wù)都下載完成后你才通知界面說(shuō)完成的了。下面是一段例子代碼:
dispatch_queue_tqueue=dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0);
dispatch_group_tgroup=dispatch_group_create();
dispatch_group_async(group,queue,^{
[NSThreadsleepForTimeInterval:1];
NSLog(@"group1");
});
dispatch_group_async(group,queue,^{
[NSThreadsleepForTimeInterval:2];
NSLog(@"group2");
});
dispatch_group_async(group,queue,^{
[NSThreadsleepForTimeInterval:3];
NSLog(@"group3");
});
dispatch_group_notify(group,dispatch_get_main_queue(),^{
NSLog(@"updateUi");
});
dispatch_release(group);
dispatch_group_async是異步的方法,運(yùn)行后可以看到打印結(jié)果:
2012-09-25 16:04:16.737 gcdTest[43328:11303] group1
2012-09-25 16:04:17.738 gcdTest[43328:12a1b] group2
2012-09-25 16:04:18.738 gcdTest[43328:13003] group3
2012-09-25 16:04:18.739 gcdTest[43328:f803] updateUi
每個(gè)一秒打印一個(gè),當(dāng)?shù)谌齻€(gè)任務(wù)執(zhí)行后,upadteUi被打印。
3、dispatch_barrier_async的使用
dispatch_barrier_async是在前面的任務(wù)執(zhí)行結(jié)束后它才執(zhí)行,而且它后面的任務(wù)等它執(zhí)行完成之后才會(huì)執(zhí)行
例子代碼如下:
dispatch_queue_tqueue=dispatch_queue_create("gcdtest.rongfzh.yc",DISPATCH_QUEUE_CONCURRENT);
dispatch_async(queue,^{
[NSThreadsleepForTimeInterval:2];
NSLog(@"dispatch_async1");
});
dispatch_async(queue,^{
[NSThreadsleepForTimeInterval:4];
NSLog(@"dispatch_async2");
});
dispatch_barrier_async(queue,^{
NSLog(@"dispatch_barrier_async");
[NSThreadsleepForTimeInterval:4];
});
dispatch_async(queue,^{
[NSThreadsleepForTimeInterval:1];
NSLog(@"dispatch_async3");
});
打印結(jié)果:
2012-09-25 16:20:33.967 gcdTest[45547:11203] dispatch_async1
2012-09-25 16:20:35.967 gcdTest[45547:11303] dispatch_async2
2012-09-25 16:20:35.967 gcdTest[45547:11303] dispatch_barrier_async
2012-09-25 16:20:40.970 gcdTest[45547:11303] dispatch_async3
請(qǐng)注意執(zhí)行的時(shí)間,可以看到執(zhí)行的順序如上所述。
4、dispatch_apply
執(zhí)行某個(gè)代碼片段N次。
dispatch_apply(5,dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0)
,^(size_tindex){
// 執(zhí)行5次
});