线程问题可能是我们在开发中经常要遇到的问题,深入了解一下很有必要。
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{//后台执行的操作 //do something. dispatch_async(dispatch_get_main_queue(), ^{//回到主线程的操作 //do something. }); });
/** * 创建一个线程在子线程中执行 * * @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), ^{ // 上面并行线程结束后调用,汇总结果, });