主队列/主线程发生什么情况,从主线程发出dispatch_sync以定位另一个调度队列?

时间:2016-10-18 05:32:12

标签: ios objective-c multithreading concurrency grand-central-dispatch

假设我在主线程上调用下面的方法。如果某个其他线程在调用该方法时正在对该数组执行写操作,则dispatch_sync将阻塞。但是它阻塞了另一个队列(不是主队列)。当阻塞时,主队列上的状态是什么(方法在disaptch_sync返回之前无法继续前进,但这被视为主队列上的异步调用)。例如:主队列会响应UI事件吗?如果是,当对用户事件的反应发生时,dispatch_sync返回时,方法调用的状态会发生什么?

-(id) objectAtIndex:(NSUInteger)index
{
    __block id obj;
    dispatch_sync(self.dataAccessQ, ^{
        obj = self.embeddedArray[index];
    });
    return obj;
}

2 个答案:

答案 0 :(得分:1)

不,主队列也类似于阻塞。

主队列绑定到主线程。每个线程一次只能执行一个控制流。如果在主线程上执行任何代码,则不能执行其他代码。

因此,等待下载到另一个队列的操作的结果将阻止等待的线程。 (不是并行Q!)这就是我们有完成处理程序的原因。

不是返回一个对象,而是为方法添加一个完成处理程序的参数,并在结束时在块内部调用它。

答案 1 :(得分:1)

它是否是主队列并不重要。无论使用哪个队列来呼叫objectAtIndex:都会阻止dispatch_sync来电,直到完成为止。

如果在主队列上调用此代码,它会像任何其他队列一样阻塞。在此期间,不会处理任何用户事件。在此期间,UI将显示为已锁定。完成后,UI将再次正常工作。