美文网首页
在 dispatch_once 中执行主线程

在 dispatch_once 中执行主线程

作者: lyleyang | 来源:发表于2017-08-24 11:51 被阅读0次

看 rect native 的 commit,发现个好玩的地方,看下面代码有问题吗?

+ (instancetype)defaultStack {
  static KACoreDataStack *stack;
  static dispatch_once_t onceToken;

  dispatch_once(&onceToken, ^{
    if ([NSThread isMainThread]) {
      stack = [[KACoreDataStack alloc] init];
    } else {
      dispatch_sync(dispatch_get_main_queue(), ^{
        stack = [[KACoreDataStack alloc] init];
      });
    }
  });

  return stack;
}

这个会导致死锁,当后台线程在执行dispatch_sync 前,主线程执行到dispatch_once,会导致死锁。详细可以看这篇文章Initializing on the main thread using dispatch_once without race conditions

解决方案

void dispatch_once_on_main_thread(dispatch_once_t *predicate,
                                  dispatch_block_t block) {
  if ([NSThread isMainThread]) {
    dispatch_once(predicate, block);
  } else {
    if (DISPATCH_EXPECT(*predicate == 0L, NO)) {
      dispatch_sync(dispatch_get_main_queue(), ^{
        dispatch_once(predicate, block);
      });
    }
  }
}

相关文章

  • GCD延时

    在主线程中延迟执行某动作,不会卡主主线程,不影响后面的东做执行 在子线程中执行某动作,不会卡主整个线程

  • 在 dispatch_once 中执行主线程

    看 rect native 的 commit,发现个好玩的地方,看下面代码有问题吗? 这个会导致死锁,当后台线程在...

  • GCD 只执行一次 dispatch_once

    dispatch_once函数能保证某段代码在程序中只被执行一次,即使在多线程环境下,也可以保证线程安全。 把这个...

  • Swift学习之多线程

    一、异步 二、延迟执行 三、多线程-once dispatch_once在Swift中已经被废弃,可以用类型属性或...

  • GCD线程延时

    //swift中的线程延时 //在主线程中延迟执行某动作,不会卡主主线程,不影响后面的东做执行 //在子线程中执行...

  • 实现延迟的几种方法

    1.在主线程中延迟执行某动作,不会卡主主线程,不影响后面的东做执行 2.在子线程中执行某动作,不会卡主整个线程 3...

  • iOS多线程学习小记『GCD的API之dispatch_once

    3.2.12 dispatch_once dispatch_once 函数是保证在应用程序执行中执行一次指定处理的...

  • GCD ④ dispatch_once

    dispatch_once (单例) dispatch_once 函数是保证在应用程序执行中只执行一次指定处理的 ...

  • Swift之延迟函数

    1.perform(必须在主线程中执行) 2.timer(必须在主线程中执行) 3.Thread (在主线程会卡主...

  • iOS学习-多线程3

    9、延迟dispatch_after 10、一次性执行dispatch_once 在当前线程上执行 原理:判断静态...

网友评论

      本文标题:在 dispatch_once 中执行主线程

      本文链接:https://www.haomeiwen.com/subject/ksosdxtx.html