当 dispatch_sync 从主线程针对另一个调度队列发出时,主 queue/main 线程会发生什么?
What happens to main queue/main thread, when a dispatch_sync is issued from main thread targeting another dispatch queue?
假设我在主线程上调用下面的方法。如果在调用该方法时其他某个线程正在对数组进行写入,则 dispatch_sync 将阻塞。但它阻塞在另一个队列(不是主队列)上。当它被阻塞时,主队列上的状态是什么(方法在 disaptch_sync returns 之前不能前进,但这是否被视为主队列上的异步调用)。例如:主队列会响应 UI 事件吗?如果是,当dispatch_sync returns 对用户事件的反应发生时,方法调用的状态会发生什么变化?
-(id) objectAtIndex:(NSUInteger)index
{
__block id obj;
dispatch_sync(self.dataAccessQ, ^{
obj = self.embeddedArray[index];
});
return obj;
}
不,主队列也类似阻塞。
主队列绑定到主线程。每个线程一次只能执行一个控制流。如果在主线程上执行了任何代码,则无法执行其他代码。
因此等待下标到另一个队列的操作结果将阻塞等待线程。 (不是并行 Q!)这就是我们有完成处理程序的原因。
不要返回对象,而是将完成处理程序的参数添加到您的方法,并在最后的块内调用它。
是不是主队列都无所谓。用于调用 objectAtIndex:
的任何队列都将阻塞 dispatch_sync
调用,直到它完成。
如果您在主队列上调用此代码,它会像任何其他队列一样阻塞。在此期间,不会处理任何用户事件。 UI 在此期间将显示为已锁定。完成后,UI 将再次正常工作。
假设我在主线程上调用下面的方法。如果在调用该方法时其他某个线程正在对数组进行写入,则 dispatch_sync 将阻塞。但它阻塞在另一个队列(不是主队列)上。当它被阻塞时,主队列上的状态是什么(方法在 disaptch_sync returns 之前不能前进,但这是否被视为主队列上的异步调用)。例如:主队列会响应 UI 事件吗?如果是,当dispatch_sync returns 对用户事件的反应发生时,方法调用的状态会发生什么变化?
-(id) objectAtIndex:(NSUInteger)index
{
__block id obj;
dispatch_sync(self.dataAccessQ, ^{
obj = self.embeddedArray[index];
});
return obj;
}
不,主队列也类似阻塞。
主队列绑定到主线程。每个线程一次只能执行一个控制流。如果在主线程上执行了任何代码,则无法执行其他代码。
因此等待下标到另一个队列的操作结果将阻塞等待线程。 (不是并行 Q!)这就是我们有完成处理程序的原因。
不要返回对象,而是将完成处理程序的参数添加到您的方法,并在最后的块内调用它。
是不是主队列都无所谓。用于调用 objectAtIndex:
的任何队列都将阻塞 dispatch_sync
调用,直到它完成。
如果您在主队列上调用此代码,它会像任何其他队列一样阻塞。在此期间,不会处理任何用户事件。 UI 在此期间将显示为已锁定。完成后,UI 将再次正常工作。