GCD - 如何在主线程上等待在主队列上执行的异步回调
Posted
技术标签:
【中文标题】GCD - 如何在主线程上等待在主队列上执行的异步回调【英文标题】:GCD - How to wait on the main thread for an async callback that is performed on the main queue 【发布时间】:2014-06-27 17:34:43 【问题描述】:我想一个接一个地执行 2 个块,其中每个块都是异步执行的。
例如
[someMethodWithCompletionHandler:^()
// do something in the completion handler
];
[anotherMethodWithCompletionHandler:^
// do something else in the completion handler after the first method completes
];
现在,我需要在“someMethodWithCompletionHandler
”完成(包括其完成处理程序)之后发生“anotherMethodWithCompletionHandler
”
我通常会创建一个dispatch_group
并在两个方法之间等待(我不能将这两个方法嵌套在另一个完成处理程序中,因为它需要移动大量代码)
但问题是在主线程中调用了第一个完成处理程序块(由方法本身在主线程中调用该块),因此我无法有效地创建一个 dispatch_group
阻塞主线程。
所以线程状态看起来像这样
// main thread here
[self doFirstPortionOfWork];
// main thread here
[self doSecondPortionOfWork];
-(void)doFirstPortionOfWork
.. a lot of stuff happening
[someMethodWithCompletionHandler:^
// this is the main thread
];
// would like to block the return here until the completion handler finishes
-(void)doSecondPortionOfWork
... a lot of work here
[anotherMethodWithCompletionHandler^
// this is also called into the main thread
];
// would like to block the return here until the completion handler finishes
那么,如果不使用大量嵌套方法并且能够阻塞主线程直到全部完成,我怎么能做到这一点呢?
【问题讨论】:
【参考方案1】:主线程与主队列相同
不可能在主线程上等待未来在主线程中的工作。你正在阻止未来的工作。
你可以这样做:
[someMethodWithCompletionHandler:^()
// do something in the completion handler
[anotherMethodWithCompletionHandler:^
// do something else in the completion handler after the first method completes
];
];
【讨论】:
我不能这样做,因为我没有嵌套 我不明白“我没有嵌套”是什么意思。以上是关于GCD - 如何在主线程上等待在主队列上执行的异步回调的主要内容,如果未能解决你的问题,请参考以下文章