相关疑难解决方法(0)

GCD在主线程中执行任务

我有一个可能来自任何线程的回调.当我得到这个回调,然后我想在主线程上执行某个任务.

我是否需要检查我是否已经在主线程上 - 或者是否因为没有执行此检查而遭受任何惩罚?请调用下面的代码?

dispatch_async(dispatch_get_main_queue(), ^{
   // do work here
});
Run Code Online (Sandbox Code Playgroud)

objective-c grand-central-dispatch

228
推荐指数
3
解决办法
11万
查看次数

如何在没有死锁的情况下同步调度主队列?

我需要同步在主队列上调度一个块.我不知道我目前是在主线程上运行还是不运行.天真的解决方案看起来像这样:

dispatch_sync(dispatch_get_main_queue(), block);
Run Code Online (Sandbox Code Playgroud)

但是如果我当前在主队列上运行的块中,则此调用会产生死锁.(同步调度等待块完成,但块甚至没有开始运行,因为我们正在等待当前块完成.)

显而易见的下一步是检查当前队列:

if (dispatch_get_current_queue() == dispatch_get_main_queue()) {
    block();
} else {
    dispatch_sync(dispatch_get_main_queue(), block);
}
Run Code Online (Sandbox Code Playgroud)

这有效,但很难看.在我至少将它隐藏在一些自定义功能之前,是不是有更好的解决方案来解决这个问题?我强调我不能异步调度块 - 应用程序处于异步调度块将"执行得太晚"的情况.

objective-c grand-central-dispatch ios objective-c-blocks

62
推荐指数
1
解决办法
2万
查看次数

viewDidLoad中的DispatchQueue.main.async {}

我想知道如果我从viewDidLoad方法在主队列中异步调用某些内容会发生什么.一个小实验向我展示了这些结果:

这段代码:

override func viewDidLoad() {
    super.viewDidLoad()

    firstSelector()
    DispatchQueue.main.async {
        self.secondSelector()
    }
    for i in 1...10 {
        print(i)
    }
    thirdSelector()

}

func firstSelector() {
    print("First selector fired")
}

func secondSelector() {
    print("Second selector fired")
}

func thirdSelector() {
    print("Third selector fired")
}
Run Code Online (Sandbox Code Playgroud)

给出这些印刷品:

First selector fired
1
2
3
4
5
6
7
8
9
10
Third selector fired
Second selector fired
Run Code Online (Sandbox Code Playgroud)

所以最后一个被调用的方法是secondSelector.我认为这是因为主队列是串行的,当我异步调用某个方法(在本例中为secondSelector)时,它立即返回并等待直到所有其他方法都完成.在队列没有任务之后,它完成了我异步调用的方法.我的想法是对的吗?

concurrency asynchronous grand-central-dispatch ios swift

6
推荐指数
1
解决办法
3302
查看次数