线程问题可能是我们在开发中经常要遇到的问题,深入了解一下很有必要。
一、后台执行操作拿到数据回到主线程展示,经常要用到
1.1、第一种方法
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{//后台执行的操作
//do something.
dispatch_async(dispatch_get_main_queue(), ^{//回到主线程的操作
//do something.
});
});
1.2、第二种方法
/**
* 创建一个线程在子线程中执行
*
* @param aSelector 方法名(新创建的线程)
* @param arg 方法的参数
*/
- (void)performSelectorInBackground:(SEL)aSelector withObject:(nullable id)arg;
/**
* 在主线程中,执行制定的方法
*
* @param aSelector 方法名
* @param arg 方法参数
* @param wait YES,指定当前线程是否要被阻塞,直到主线程将我们制定的代码块执行完
*/
- (void)performSelectorOnMainThread:(SEL)aSelector withObject:(nullable id)arg waitUntilDone:(BOOL)wait;
/**
* 自定义回到哪个线程执行的方法
*
* @param aSelector 方法名
* @param thr 线程名
* @param arg 方法参数
* @param wait YES(如果当前线程为主线程的时候,waitUntilDone:YES参数无用)
*/
- (void)performSelector:(SEL)aSelector onThread:(NSThread *)thr withObject:(nullable id)arg waitUntilDone:(BOOL)wait;
二、代码只需要执行一次的操作,比如单例的创建
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
//code
});
三、延时操作
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
//code
});
四、分组操作
// 合并汇总结果
dispatch_group_t group = dispatch_group_create();
dispatch_group_async(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0), ^{
// 并行执行的线程一
});
dispatch_group_async(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0), ^{
// 并行执行的线程二
});
dispatch_group_notify(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0), ^{
// 上面并行线程结束后调用,汇总结果,
});