同步只能在當(dāng)前線程中執(zhí)行任務(wù),不具備開啟新線程的能力右莱。異步可以在新線程中執(zhí)行任務(wù),具備開啟新線程的能力。
多線程:一個(gè)進(jìn)程可以開啟多條線程,每條線程可以執(zhí)行不同的任務(wù)窗声。實(shí)質(zhì)上在同一時(shí)間,CPU只能處理一條線程,CPU快速在多線程間調(diào)度,產(chǎn)生并發(fā)執(zhí)行假象。
多線程實(shí)例應(yīng)用
-(void)test06
{
#異步主隊(duì)列: 異步不會(huì)阻塞主線程 主隊(duì)列任務(wù)必須放在主線程執(zhí)行
dispatch_async(dispatch_get_main_queue(), ^{
NSLog(@"%@--A",[NSThread currentThread]);
});
#第一步: 主線程執(zhí)行 輸出B
NSLog(@"%@--B",[NSThread currentThread]);
dispatch_queue_t queue=dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0);
#同步全局并發(fā)隊(duì)列: 同步會(huì)阻塞主線程 第二步: 輸出C
dispatch_sync(queue, ^{
NSLog(@"%@--C",[NSThread currentThread]);
});
#異步全局并發(fā)隊(duì)列: 開啟新線程執(zhí)行任務(wù) 未阻塞主線程
dispatch_async(queue, ^{
NSLog(@"%@--D",[NSThread currentThread]);
});
#異步主隊(duì)列: 異步不會(huì)阻塞主線程 主隊(duì)列任務(wù)必須放在主線程執(zhí)行
dispatch_async(dispatch_get_main_queue(), ^{
NSLog(@"%@--E",[NSThread currentThread]);
});
#此方法主線程執(zhí)行 相當(dāng)于異步主隊(duì)列
[self performSelector:@selector(testMethod) withObject:nil afterDelay:0];
#第三步: 主隊(duì)列執(zhí)行 輸出F
NSLog(@"%@--F",[NSThread currentThread];
/*
主隊(duì)列任務(wù)順序: G->E->A
輸出結(jié)果為:
B C F D A E G
*/
}
-(void)testMethod{
NSLog(@"%@--G",[NSThread currentThread]);
}
#打印結(jié)果
{number = 1, name = main}--B
{number = 1, name = main}--C
{number = 1, name = main}--F
{number = 3, name = (null)}--D
{number = 1, name = main}--A
{number = 1, name = main}--E
{number = 1, name = main}--G
-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
[self test01];
[self test02];
[self test03];
[self test04];
[self test05];
}
-(void)test05{
NSOperationQueue *queue=[[NSOperationQueue alloc] init];
NSBlockOperation *operationA=[NSBlockOperation blockOperationWithBlock:^{
NSLog(@"%@--下載第A張圖片",[NSThread currentThread]);
}];
NSBlockOperation *operationB=[NSBlockOperation blockOperationWithBlock:^{
NSLog(@"%@--下載第B張圖片",[NSThread currentThread]);
}];
NSBlockOperation *operationC=[NSBlockOperation blockOperationWithBlock:^{
NSLog(@"%@--下載第C張圖片",[NSThread currentThread]);
}];
# [queue addOperation:operationA];
# [queue addOperation:operationB];
# [queue addOperation:operationC];
#設(shè)置依賴 按需求A B C 順序執(zhí)行
[operationB addDependency:operationA];
[operationC addDependency:operationB];
#添加任務(wù)到隊(duì)列
[queue addOperation:operationA];
[queue addOperation:operationB];
[queue addOperation:operationC];
}
-(void)test04{
NSOperationQueue *queue=[[NSOperationQueue alloc] init];
#設(shè)置最大并發(fā)數(shù)
# queue.maxConcurrentOperationCount=1;
NSBlockOperation *operation1=[NSBlockOperation blockOperationWithBlock:^{
NSLog(@"%@--下載第一張圖片",[NSThread currentThread]);
}];
NSBlockOperation *operation2=[NSBlockOperation blockOperationWithBlock:^{
NSLog(@"%@--下載第二張圖片",[NSThread currentThread]);
}];
NSBlockOperation *operation3=[NSBlockOperation blockOperationWithBlock:^{
NSLog(@"%@--下載第三張圖片",[NSThread currentThread]);
}];
#InvocationOperation
NSInvocationOperation *operation4=[[NSInvocationOperation alloc] initWithTarget:self selector:@selector(downloadOperation) object:nil];
#添加操作到隊(duì)列
[queue addOperation:operation1];
[queue addOperation:operation2];
[queue addOperation:operation3];
[queue addOperation:operation4];
[queue addOperationWithBlock:^{
NSLog(@"%@--下載第四張圖片",[NSThread currentThread]);
}];
[queue addOperationWithBlock:^{
NSLog(@"%@--下載第五張圖片",[NSThread currentThread]);
}];
# [queue cancelAllOperations];
}
-(void)downloadOperation{
NSLog(@"downloadOperation--%@",[NSThread currentThread]);
}
-(void)test03{
dispatch_group_t group=dispatch_group_create();
dispatch_queue_t queue=dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
#下載第一張圖片
static UIImage *image1=nil;
# __block UIImage *image1=nil;
dispatch_group_async(group, queue, ^{
NSURL *url1=[NSURL URLWithString:@"http:#pic1.nipic.com/2008-12-25/2008122510134038_2.jpg"];
NSData *data1=[NSData dataWithContentsOfURL:url1];
image1=[UIImage imageWithData:data1];
NSLog(@"image1--%@",[NSThread currentThread]);
});
#下載第二張圖片
static UIImage *image2=nil;
# __block UIImage *image2=nil;
dispatch_group_async(group, queue, ^{
NSURL *url2=[NSURL URLWithString:@"https:#www.baidu.com/img/bd_logo1.png"];
NSData *data2=[NSData dataWithContentsOfURL:url2];
image2=[UIImage imageWithData:data2];
NSLog(@"image2--%@",[NSThread currentThread]);
});
dispatch_group_notify(group, queue, ^{
NSLog(@"notify--%@",[NSThread currentThread]);
#開啟上下文
UIGraphicsBeginImageContextWithOptions(image1.size, NO, 0.0);
#繪制第一張圖片
CGFloat image1W=image1.size.width;
CGFloat image1H=image1.size.height;
[image1 drawInRect:CGRectMake(0, 0, image1W, image1H)];
#繪制第二張圖片
CGFloat image2W=image2.size.width;
CGFloat image2H=image2.size.height;
[image2 drawInRect:CGRectMake(image1W-image2W, image1H-image2H, image2W, image2H)];
#獲取繪制好的圖片
UIImage *image=UIGraphicsGetImageFromCurrentImageContext();
#關(guān)閉上下文
UIGraphicsEndImageContext();
#回主線程刷新界面
dispatch_async(dispatch_get_main_queue(), ^{
NSLog(@"async--%@",[NSThread currentThread]);
self.imageView.image=image;
});
});
}
-(void)test02{
#第一張圖片
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
NSURL *url1=[NSURL URLWithString:@"http:#pic1.nipic.com/2008-12-25/2008122510134038_2.jpg"];
NSData *data1=[NSData dataWithContentsOfURL:url1];
self.image1=[UIImage imageWithData:data1];
[self mergerImage];
});
#第二張圖片
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
NSURL *url2=[NSURL URLWithString:@"https:#www.baidu.com/img/bd_logo1.png"];
NSData *data2=[NSData dataWithContentsOfURL:url2];
self.image2=[UIImage imageWithData:data2];
[self mergerImage];
});
}
#合并圖片
-(void)mergerImage{
if (self.image1 == nil || self.image2 == nil) {
return;
}else{
UIGraphicsBeginImageContextWithOptions(self.image1.size, NO, 0.0);
#繪制第一張圖
CGFloat image1W=self.image1.size.width;
CGFloat image1H=self.image1.size.height;
[self.image1 drawInRect:CGRectMake(0, 0, image1W, image1H)];
#繪制第二張圖
CGFloat image2W=self.image2.size.width;
CGFloat image2H=self.image2.size.height;
[self.image2 drawInRect:CGRectMake(image1W-image2W, image1H-image2H, image2W, image2H)];
#獲取繪制后的圖片
UIImage *image=UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
#UI界面顯示
dispatch_async(dispatch_get_main_queue(), ^{
self.imageView.image=image;
});
}
}
-(void)test01{
dispatch_queue_t queue=dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_async(queue, ^{
NSLog(@"%@--global_queue",[NSThread currentThread]);
#下載第一張圖片
NSURL *url1=[NSURL URLWithString:@"http:#pic1.nipic.com/2008-12-25/2008122510134038_2.jpg"];
NSData *data1=[NSData dataWithContentsOfURL:url1];
UIImage *image1=[UIImage imageWithData:data1];
#下載第二張圖片
NSURL *url2=[NSURL URLWithString:@"https:#www.baidu.com/img/bd_logo1.png"];
NSData *data2=[NSData dataWithContentsOfURL:url2];
UIImage *image2=[UIImage imageWithData:data2];
#合并圖片
UIGraphicsBeginImageContextWithOptions(image1.size, NO, 0);
#繪制第一張圖片
CGFloat image1W=image1.size.width;
CGFloat image1H=image1.size.height;
[image1 drawInRect:CGRectMake(0, 0, image1W, image1H)];
#繪制第二張圖片
CGFloat image2W=image2.size.width*0.5;
CGFloat image2H=image2.size.height*0.5;
[image2 drawInRect:CGRectMake(image1W-image2W, image1H-image2H, image2W, image2H)];
#獲取繪制好的合成圖片
UIImage *image=UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
dispatch_async(dispatch_get_main_queue(), ^{
NSLog(@"%@--main_queue",[NSThread currentThread]);
self.imageView.image=image;
});
});
}