iOS 多线程
多线程
NSThread:
1.NSThread *thread = [[NSThread alloc]initWithTarget:self selector:@selector(thread) object:nil];
[thread start];
2.[NSThread detachNewThreadSelector:@selector(operation1) toTarget:self withObject:@"哈哈哈”];
3.[self performSelectorInBackground:@selector(thread:) withObject:@"hhhh"];
NSOperation:
优点:不需要管理生命周期,可以把精力放在代码上上面
缺点:抽象类,必须要使用其子类对象才能用
顺序:
1.创建队列
2.创建任务
3.返回主线程
queue
[NSOperationQueue mainQueue]
回主线程
self performSelectorOnMainThread:<#(SEL)#> withObject:<#(id)#> waitUntilDone:<#(BOOL)#>
dispatch_async(dispatch_get_main_queue(), ^{
});
1.NSOperationQueue *operationQ = [[NSOperationQueue alloc]init];
[operationQ addOperationWithBlock:^{
//执行的事件
for (int i = 0; i < 50; i++) {
NSLog(@"thread线程---》%d",i);
}
}];
2.NSOperationQueue *operationQ = [[NSOperationQueue alloc]init];
operationQ.maxConcurrentOperationCount = 2;
NSInvocationOperation *invocation1 = [[NSInvocationOperation alloc]initWithTarget:self selector:@selector(operation1) object:nil];
[invocation1 setQueuePriority:NSOperationQueuePriorityVeryLow];
[operationQ addOperation:invocation1];
GCD(Grand Central Dispath ):
优点
多核硬件上,性能更佳
操作简单,只要告诉GCD你要执行的任务,不需要管理线程
1.创建一个队列
(1)并行队列:可以多个线程同时执行
参数1.优先级(一般给0),参数2.标示(正常为0)
dispatch_queue_t queue = dispatch_get_global_queue(<#long identifier#>, <#unsigned long flags#>)
(2)串行队列:并发数为1,
参数1.线程名称(c字符串),参数2.直接给NULL
dispatch_queue_t queue = dispatch_queue_create(<#const char *label#>, <#dispatch_queue_attr_t attr#>)
2.任务
异步:开辟新线程,在新线程上执行
同步:在当前线程上执行
(1)同步
//参数1.放入的队列,参数2.我们要做的任务
dispatch_sync(<#dispatch_queue_t queue#>, <#^(void)block#>)
(2)异步
//参数1.放入的队列,参数2.我们要做的任务
dispatch_async(<#dispatch_queue_t queue#>, <#^(void)block#>)
3.返回
1.dispatch_async(dispatch_get_main_queue(), ^{
//回到主线程执行的任务
});
2.self performSelectorOnMainThread:<#(SEL)#> withObject:<#(id)#> waitUntilDone:<#(BOOL)#>
//线程组
// dispatch_group_t group = dispatch_group_create();
//
// dispatch_queue_t queue = dispatch_get_global_queue(0, 0);
//
// dispatch_group_async(group, queue, ^{
// //子线程操作的内容
// });
//
//
// dispatch_group_notify(group, dispatch_get_main_queue(), ^{
// //回到主线程之后做得操作
// });
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。