標(biāo)簽(空格分隔): 多線程 GCD
延時(shí)執(zhí)行幾種常見方法
1.2的兩種方法是通過 RunLoop 實(shí)現(xiàn)的
- (void)creatDelayThread{
// 1、調(diào)用 NSObject 的 延時(shí)方法 (2.0秒)
[self performSelector:@selector(run:) withObject:nil afterDelay:2.0];
// 2肪凛、NSTimer 延時(shí)
[NSTimer scheduledTimerWithTimeInterval:2.0 target:self selector:@selector(run:) userInfo:nil repeats:NO];
// 3稚疹、 使用 GCD 函數(shù)
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
NSLog(@"-- run -- ");
});
}
一次性執(zhí)行
整個(gè)程序運(yùn)行中,只調(diào)用一次克胳。注意它和懶加載的區(qū)別德挣,無法代替懶加載使用恭垦。
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
// 只執(zhí)行一次代碼(這里是線程安全的)
NSLog(@"run");
});
GCD 快速迭代快速遍歷,例如: 剪切文件同時(shí)執(zhí)行
相對于 for 循環(huán)盲厌,使用 快速迭代署照,幾乎可以同時(shí)執(zhí)行
- (void)apply{
for (NSInteger i; i < 10; i++) {
NSLog(@"順序打印 %ld", (long)i);
}
// “快速迭代“
dispatch_queue_t queque = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_apply(10, queque, ^(size_t index) {
NSLog(@" 同時(shí) ");
});
}
快速迭代
GCD 隊(duì)列組
將任務(wù)放到一個(gè)隊(duì)列組中祸泪, 隊(duì)列組執(zhí)行完之后吗浩,再去執(zhí)行相關(guān)任務(wù)。
舉例圖片合成
- (void)group{
dispatch_queue_t queque = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
// 隊(duì)列組
dispatch_group_t group = dispatch_group_create();
// 下載圖片 1
dispatch_group_async(group, queque, ^{
//圖片資源網(wǎng)絡(luò)路徑
NSURL *url = [NSURL URLWithString:@"http://img.ivsky.com/img/tupian/pic/201604/12/xinduqiao-002.jpg"];
//加載圖片
NSData *data = [NSData dataWithContentsOfURL:url];
// 生成圖片
self.image1 = [UIImage imageWithData:data];
});
// 下載圖片 2
dispatch_group_async(group, queque, ^{
//圖片資源網(wǎng)絡(luò)路徑
NSURL *url = [NSURL URLWithString:@"http://img.ivsky.com/img/bizhi/pic/201603/08/navy_field_4-001.jpg"];
//加載圖片
NSData *data = [NSData dataWithContentsOfURL:url];
// 生成圖片
self.image2 = [UIImage imageWithData:data];
});
// 合成下載圖片 1 和 2
dispatch_group_notify(group, queque, ^{
NSLog(@"%@, %@", self.image1,self.image2);
//開啟圖形上下文
UIGraphicsBeginImageContext(CGSizeMake(100, 100));
// 繪制圖片
[self.image1 drawInRect:CGRectMake(0, 0, 50, 100)];
[self.image2 drawInRect:CGRectMake(50, 0, 50, 100)];
//獲取上下文中的圖片
self.imageGrap = UIGraphicsGetImageFromCurrentImageContext();
// 結(jié)束上下文
UIGraphicsEndImageContext();
// 將新圖片展示出來 回到主線程
dispatch_async(dispatch_get_main_queue(), ^{
self.imageView.image = self.imageGrap;
});
});
}