多线程使用技巧(NSTheard/NSOperationQueue/GCD)
NSTheard
[NSThread isMainThread];可以用来判断是否在主线程上执行。
创建一个,然后在子线程上执行。
[NSThread detachNewThreadSelector:@selector(download) toTarget:self withObject:nil];
NSObject中封装的线程调用方法
[self performSelectorInBackground:@selector(download) withObject:nil];
[self performSelectorOnMainThread:<#(nonnull SEL)#> withObject:<#(nullable id)#> waitUntilDone:<#(BOOL)#>];
NSOperationQueue
1.创建一个队列后,直接添加一个执行闭包,闭包中的任务在子线程进行。
2.可以定义子线程的最大数,即可控制执行速度,还可以取消尚未执行的任务。
//子线程
NSOperationQueue *queue = [NSOperationQueue new];
[queue addOperationWithBlock:^{
NSLog(@"he");
for (NSInteger i = 0; i<100; i++) {
queue.maxConcurrentOperationCount = 2;
[queue addOperationWithBlock:^{
NSLog(@"---->%ld",i);
[queue cancelAllOperations];
}];
}
}];
//主线程
NSLog(@"we");
dispatch
串行和并行:串行会卡住线程(用来描述线程)
同步和异步:(调用方法的方式)
主要使用:
-
dispatch_queue_t mainqueue = dispatch_get_main_queue();
dispatch_queue_t subqueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); -
dispatch_async(<#dispatch_queue_t queue#>, <#^(void)block#>)
-
dispatch_sync(<#dispatch_queue_t queue#>, <#^(void)block#>)
-
dispatch_group_notify
-
dispatch_barrier_async
-
dispatch_group_enter
-
dispatch_group_leave
#import "ViewController.h"
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
#if 0
//定义主队列和子队列(队列会自动管理线程)
dispatch_queue_t mainqueue = dispatch_get_main_queue();
dispatch_queue_t subqueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
for (NSInteger i = 0; i<100; i++) {
//异步方法
dispatch_async(subqueue, ^{
NSLog(@"---->%ld",i);
});
NSLog(@"hello the world");
}
NSLog(@"主线程");
#endif
NSLog(@"主线程");
//串行队列中的方法既可以同步执行也可以异步执行
//串行队列
// dispatch_queue_t myqueue = dispatch_queue_create("test.queue", DISPATCH_QUEUE_SERIAL);
//当前队列是主队列的时候,使用同步执行会造成死锁(少用同步方法!)
// myqueue = dispatch_get_main_queue();
#if 0
//同步方法,只有闭包中的任务完成后,才会执行后面的任务,(都是在主线程中进行)
dispatch_sync(myqueue, ^{
NSLog(@"hello");
});
NSLog(@"world");
//异步方法,闭包中的方法不知道什么时候执行,但是并不会影响后面的任务,闭包中的任务在子线程执行
dispatch_async(myqueue, ^{
NSLog(@"hey man");
});
NSLog(@"you are good");
#endif
#if 0
//当前队列不是主队列的时候,默认异步执行方法都是在子进程中,多个异步方法在同一子进程中
dispatch_async(myqueue, ^{
NSLog(@"-->1");
});
dispatch_async(myqueue, ^{
NSLog(@"-->2");
});
dispatch_async(myqueue, ^{
NSLog(@"-->3");
});
NSLog(@"finished");
#endif
#if 0
dispatch_async(myqueue, ^{
NSLog(@"1");
});
dispatch_async(myqueue, ^{
NSLog(@"2");
});
//barrier在异步执行完之前的任务后,再执行某一个方法,再异步执行之后的方法
dispatch_barrier_async(myqueue, ^{
NSLog(@"barrier");
});
dispatch_async(myqueue, ^{
NSLog(@"3");
});
dispatch_async(myqueue, ^{
NSLog(@"4");
});
#endif
dispatch_group_t group = dispatch_group_create();
//创建并行队列,异步执行,在不同的子线程
dispatch_queue_t myqueue = dispatch_queue_create("myqueue", DISPATCH_QUEUE_CONCURRENT);
dispatch_group_async(group, myqueue, ^{
NSLog(@"1");
});
dispatch_group_async(group, myqueue, ^{
NSLog(@"2");
});
//监听异步执行是否完成,完成后执行某一个方法
dispatch_group_notify(group, myqueue, ^{
NSLog(@"done");
});
//当异步执行中嵌套有异步执行的方法时,采用dispatch_group_enter/dispatch_group_leave来监听嵌套中的任务是否完成
dispatch_group_async(group, myqueue, ^{
dispatch_group_enter(group);
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
NSLog(@"5");
});
dispatch_group_leave(group);
NSLog(@"hello");
});
dispatch_group_async(group, myqueue, ^{
NSLog(@"3");
});
dispatch_group_async(group, myqueue, ^{
NSLog(@"4");
});
}
@end
网友评论