多多色-多人伦交性欧美在线观看-多人伦精品一区二区三区视频-多色视频-免费黄色视屏网站-免费黄色在线

國內(nèi)最全IT社區(qū)平臺 聯(lián)系我們 | 收藏本站
阿里云優(yōu)惠2
您當(dāng)前位置:首頁 > php開源 > 綜合技術(shù) > iOS中 GCD-Grand Central Dispath 多線程 UI_21

iOS中 GCD-Grand Central Dispath 多線程 UI_21

來源:程序員人生   發(fā)布時間:2016-04-25 13:26:57 閱讀次數(shù):2538次

 GCD:Grand Central Dispath "牛逼的中樞調(diào)度器";是純C語言編寫的,提供了很多比較強大的函數(shù)

 GCD:優(yōu)勢

 1.目前是蘋果主推的線程管理方式

 2.它會自動的利用更多的CPU資源(雙核,4核)

 3.它會自動的管理線程的生命周期(線程的創(chuàng)建/調(diào)度/燒毀);

 4.程序員只需要告知GCD自己想要履行的哪些任務(wù),不需要寫1行線程管理的代碼


#import "ViewController.h" #define kURLString1 @"http://www.nbsheji.cn/uploadfiles/2010113143922418.jpg" #define kURLString2 @"http://amuse.nen.com.cn/imagelist/11/21/9as70n3ir61b.jpg" @interface ViewController () @property (retain, nonatomic) IBOutlet UIImageView *FirstView;//第1個圖片 @property (retain, nonatomic) IBOutlet UIImageView *secondView;//第2個圖片 @property(nonatomic,retain)NSMutableArray *dataSource;//存儲要求下來的數(shù)據(jù) @end @implementation ViewController //懶加載 - (NSMutableArray *)dataSource{ if (_dataSource == nil) { self.dataSource = [NSMutableArray arrayWithCapacity:0]; } return [[_dataSource retain]autorelease]; }

串行隊列:(線程同步)添加到這個隊列的任務(wù)1個接1個的履行(1個任務(wù)完成,才再去完成另外一個任務(wù))


- (IBAction)handleSerialQueue:(UIButton *)sender { //獲得系統(tǒng)串行隊列 // (1)向系統(tǒng)的創(chuàng)建的串行隊列中添加異步任務(wù),還是在主線程中完成; // (2)向系統(tǒng)創(chuàng)建的串行隊列中添加同步任務(wù),會造成線程死鎖,致使其他人沒法履行; dispatch_queue_t queue1 = dispatch_get_main_queue(); //01:隊列的唯1標(biāo)識,采取反域名情勢 //02:隊列的屬性類型,也就是標(biāo)識這個隊列是串行隊列還是并行隊列 // (1)自己創(chuàng)建的串行隊列中添加異步任務(wù)是在子線程中完成任務(wù); // (2)自己創(chuàng)建的串行隊列中添加同步任務(wù)是在主線程中完成任務(wù); dispatch_queue_t queue2 = dispatch_queue_create("com.xcqnzf.xuchang", DISPATCH_QUEUE_SERIAL); /* //異步任務(wù) //第1個參數(shù):任務(wù)添加到隊列名稱 //第2個參數(shù):block履行任務(wù)內(nèi)容 dispatch_async(queue2, ^{ NSLog(@"任務(wù)1 %@ %d",[NSThread currentThread],[NSThread currentThread].isMainThread); }); dispatch_async(queue2, ^{ NSLog(@"任務(wù)2 %@ %d",[NSThread currentThread],[NSThread currentThread].isMainThread); }); dispatch_async(queue2, ^{ NSLog(@"任務(wù)3 %@ %d",[NSThread currentThread],[NSThread currentThread].isMainThread); }); //釋放掉自己的創(chuàng)建的隊列,出現(xiàn)create就要釋放 dispatch_release(queue2); */ //同步任務(wù) dispatch_sync(queue2, ^{ NSLog(@"任務(wù)1 %@ %d",[NSThread currentThread],[NSThread currentThread].isMainThread); }); dispatch_sync(queue2, ^{ NSLog(@"任務(wù)2 %@ %d",[NSThread currentThread],[NSThread currentThread].isMainThread); }); dispatch_sync(queue2, ^{ NSLog(@"任務(wù)3 %@ %d",[NSThread currentThread],[NSThread currentThread].isMainThread); }); // 總結(jié):同步任務(wù):不管在哪個隊列中都是主線程中履行,但是不能將其添加到系統(tǒng)自帶的串行隊列中; // 異步任務(wù):在自己創(chuàng)建的串行隊列中,在子線程中履行,如果是系統(tǒng)創(chuàng)建的隊列在主線程中履行; }

2.并行隊列 (線程并發(fā)) 添加到此隊列的任務(wù)同時履行  假象

- (IBAction)handleConcurrentQueue:(UIButton *)sender { //1.獲得系統(tǒng)自帶的并行隊列 //01.隊列的優(yōu)先級 //02.預(yù)留參數(shù) 給0 dispatch_queue_t queue1 = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); //2.自己創(chuàng)建并行隊列 (1般不自己創(chuàng)建并行隊列,系統(tǒng)的并行隊列已夠用了) dispatch_queue_t queue2 = dispatch_queue_create("com.xcqnzf.xuchang", DISPATCH_QUEUE_CONCURRENT); //同步任務(wù) dispatch_sync(queue1, ^{ NSLog(@"同步任務(wù)%@ %d",[NSThread currentThread],[NSThread currentThread].isMainThread); }); //異步任務(wù) dispatch_async(queue2, ^{ NSLog(@"任務(wù)1%@ %d",[NSThread currentThread],[NSThread currentThread].isMainThread); }); dispatch_async(queue2, ^{ NSLog(@"任務(wù)2%@ %d",[NSThread currentThread],[NSThread currentThread].isMainThread); }); dispatch_async(queue2, ^{ NSLog(@"任務(wù)3%@ %d",[NSThread currentThread],[NSThread currentThread].isMainThread); //線程間的通訊 //由子線程回到主線程 //獲得系統(tǒng)的串行隊列 dispatch_async(dispatch_get_main_queue(), ^{ NSLog(@"我回到主線程了"); }); }); //釋放出現(xiàn)create就要釋放 dispatch_release(queue2); }

3.分組隊列:把多個任務(wù)添加到1個分組中履行,此時會在所有的任務(wù)完成后會自動發(fā)1個通

知,dispatch_group_notifity接收這個消息,然后在所有任務(wù)完成以后處理


- (IBAction)handleGroupQueue:(UIButton *)sender { //1.創(chuàng)建并行隊列,并履行任務(wù) dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); __block typeof(self)weakSelf = self; //創(chuàng)建分組異步同步任務(wù) dispatch_group_t group = dispatch_group_create(); //01.分組名 //02.要添加的隊列名 //03.要履行的任務(wù) dispatch_group_async(group, queue, ^{ NSURL *urlString = [NSURL URLWithString:kURLString1]; NSData *data1 = [NSData dataWithContentsOfURL:urlString]; //使用數(shù)組寄存要求下來的數(shù)據(jù) [weakSelf.dataSource addObject:data1]; }); dispatch_group_async(group, queue, ^{ NSURL *url = [NSURL URLWithString:kURLString2]; NSData *data2 = [NSData dataWithContentsOfURL:url]; [weakSelf.dataSource addObject:data2]; }); //分組中的任務(wù)都完成后會自動觸發(fā)下面的方法 dispatch_group_notify(group, queue, ^{ weakSelf.FirstView.image = [UIImage imageWithData:weakSelf.dataSource[0]]; weakSelf.secondView.image = [UIImage imageWithData:weakSelf.dataSource[1]]; }); //釋放分組 dispatch_release(group); }


4.障礙隊列

- (IBAction)handleBarrierQueue:(UIButton *)sender { //1.使用障礙隊列只能使用自己創(chuàng)建的并列隊列,不能使用系統(tǒng)的并行隊列 dispatch_queue_t queue = dispatch_queue_create("com.xcqnzf.xuchang", DISPATCH_QUEUE_CONCURRENT); //2.往并行隊列中添加任務(wù) dispatch_async(queue, ^{ NSLog(@"A寫入文件"); }); dispatch_async(queue, ^{ NSLog(@"B寫入文件"); }); dispatch_async(queue, ^{ NSLog(@"C寫入文件"); }); //添加障礙,間隔寫入和讀取的任務(wù),障礙任務(wù)之前的任務(wù)都完成了才能繼續(xù)完成障礙任務(wù)后面的任務(wù) dispatch_barrier_async(queue, ^{ NSLog(@"我是障礙任務(wù),讀取的任務(wù)先等會"); }); dispatch_async(queue, ^{ NSLog(@"D讀取文件"); }); dispatch_async(queue, ^{ NSLog(@"D讀取文件"); }); dispatch_async(queue, ^{ NSLog(@"E讀取文件"); }); //3.釋放 dispatch_release(queue); }


只履行1次

- (IBAction)handleOnce:(UIButton *)sender { static dispatch_once_t oneToken ; // dispatch_once(&oneToken, ^{ NSLog(@"有本事讓我走兩次"); }); }

這里需要寫1個單例

Helper.h @interface Helper : NSObject + (Helper *)shareHelper; @end Helper.h @implementation Helper static Helper *helper = nil; + (Helper *)shareHelper{ //VIP static dispatch_once_t oneToken; dispatch_once(&oneToken, ^{ helper = [[Helper alloc]init]; }); return helper; } @end


重復(fù)任務(wù)

- (IBAction)handleRepeat:(UIButton *)sender { //1.獲得系統(tǒng)的并行隊列 dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); //2.向隊列中添加重復(fù)任務(wù) //01.任務(wù)重復(fù)的次數(shù) //02.任務(wù)添加到的隊列名稱 //03.當(dāng)前是第幾次重復(fù)這個任務(wù) dispatch_apply(10, queue, ^(size_t times) { NSLog(@"我要吃爆米花,這是我第%ld吃",times); }); }

延遲任務(wù) 1個任務(wù)要履行的時候先等上1段時間再做


- (IBAction)handlePing:(UIButton *)sender { //創(chuàng)建1個延遲任務(wù) //01. DISPATCH_TIME_NOW 表示從當(dāng)前時間開始 //02. 表示過量少秒才去履行任務(wù) //03. 串行的主隊列 dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ NSLog(@"延遲任務(wù)在主線程中履行"); }); }
//釋放
- (void)dealloc {
    [_FirstView release];
    [_secondView release];
    self.dataSource = nil;
    [super dealloc];
}



分組隊列效果:

生活不易,碼農(nóng)辛苦
如果您覺得本網(wǎng)站對您的學(xué)習(xí)有所幫助,可以手機掃描二維碼進行捐贈
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關(guān)閉
程序員人生
主站蜘蛛池模板: 亚洲伊人成人网 | 午夜视频入口 | 欧美日本一 | 亚洲1区2区3区4区 | 最近的免费中文字幕视频 | 亚洲国产成人久久综合一 | 欧美另类网站 | 精品免费久久久久久久 | 99在线视频精品费观看视 | 国产日韩久久久精品影院首页 | 日本高清免费视频色www | 久久天天躁夜夜躁狠狠躁2020 | 韩国av片永久免费 | 欧美日韩a | 午夜毛片不卡高清免费 | 国产激情一区二区三区 | 日本一级α一片免费视频 | 经典三级一区二区三区视频 | 欧美亚洲一区二区三区 | 国产福利一区在线 | 最近中文字幕视频完整 | 伊人精品成人久久综合欧美 | 女人18毛片a级18毛多水真多 | 国产毛片精品 | 日韩精品欧美国产精品亚 | 一本大道加勒比久久 | 91久久偷偷做嫩草影院免费 | 日本xxxx黑人| 国产精品66福利在线观看 | 国产香蕉偷在线观看视频 | 欧美jizzhd极品欧美 | 奇米4444 | 欧美高清成人videosex | 播放四川美女一级毛片半小时 | 亚洲欧美久久精品一区 | 免费看国产精品久久久久 | 亚洲免费高清视频 | 国产毛片视频网站 | 欧美另类高清 videos | 玖玖在线视频 | 福利二区视频 |