#PRagma mark - 使用GCD創建一個異步任務- (void)createAsyncTask{ //創建一個異步任務 //參數1:傳入queue,有3種queue //main queue 主隊列(UI主線程) //global queue 全局隊列(理解為工作線程) //自定義queue dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); dispatch_async(queue, ^{ for (int i=0; i<20; i++) { NSLog(@"A = %d",i); } }); dispatch_async(queue, ^{ for (int i=0; i<20; i++) { NSLog(@"B = %d",i); } }); }
#pragma mark - 模擬網絡下載- (void)simulateNetWordDownload{ _progressView = [[UiprogressView alloc] initWithFrame:CGRectMake(10, 100, 300, 20)]; [self.view addSubview:_progressView]; //GCD最簡單開啟異步任務的形式 dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ for (int i=0; i<100; i++) { //子線程中不能直接更新UI// progressView.progress+=0.01; //(1)更新UI dispatch_get_main_queue() 作用:切回主線程更新UI dispatch_async(dispatch_get_main_queue(), ^{ _progressView.progress+=0.01; }); [NSThread sleepForTimeInterval:0.1]; } //(2)最后顯示對話框 dispatch_async(dispatch_get_main_queue(), ^{ UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"提示" message:@"下載完成" delegate:self cancelButtonTitle:@"取消" otherButtonTitles: nil]; [alert show]; }); //(1)(2)同步執行,先(1)后(2) }); }
#pragma mark - 只執行一次,實現單例(推薦實現的方式,線程安全)- (void)runOnce{ static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ NSLog(@"只執行一次的代碼"); });}
#pragma mark - 延時執行- (void)delayRun{ dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ NSLog(@"1111111"); });}
#pragma mark - 通知執行多個任務,等待所有任務下載完成進行處理(類似迅雷)- (void)groupRun{ //group 任務組 dispatch_group_t group = dispatch_group_create(); //7s完成 dispatch_group_async(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ for (int i=0; i<100; i++) { NSLog(@"A = %d",i); [NSThread sleepForTimeInterval:0.07]; } }); //5s完成 dispatch_group_async(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ for (int i=0; i<100; i++) { NSLog(@"B = %d",i); [NSThread sleepForTimeInterval:0.05]; } }); //10s完成 dispatch_group_async(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ for (int i=0; i<100; i++) { NSLog(@"C = %d",i); [NSThread sleepForTimeInterval:0.1]; } }); dispatch_group_notify(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ NSLog(@"所有任務完成,自動關機"); });}
新聞熱點
疑難解答