Ios 清空调度异步队列-这段代码是如何工作的?

Ios 清空调度异步队列-这段代码是如何工作的?,ios,asynchronous,grand-central-dispatch,Ios,Asynchronous,Grand Central Dispatch,我正在进行一个异步请求调用,如下所示: -(void)logout{ dispatch_async(dataQueue, ^{}); } .h文件: @interface APIManager : NSObject { dispatch_queue_t dataQueue; } .m文件: -(id)init{ dataQueue = dispatch_queue_create("com.test.dataQueue", DISPATCH_QUEUE_SERIAL);

我正在进行一个异步请求调用,如下所示:

-(void)logout{
    dispatch_async(dataQueue, ^{});
}
.h文件:

@interface APIManager : NSObject {
    dispatch_queue_t dataQueue;
}
.m文件:

-(id)init{
    dataQueue = dispatch_queue_create("com.test.dataQueue", DISPATCH_QUEUE_SERIAL);
}
此队列的使用方式如下:

dispatch_async(dataQueue, ^(void){
    //data retrieval from server + parsing
});
当用户注销时,我将清空队列,如下所示:

-(void)logout{
    dispatch_async(dataQueue, ^{});
}

我这样做对吗?我不想挂起队列然后继续

您在
注销中的代码不会清空队列,它只是在队列末尾附加一个空块


大中央调度没有取消功能。您可能想看看如何使用
NSOperationQueue
,它同样易于使用,并且具有取消功能。

调用
dispatch\u sync(dataQueue,^{})-logout
中的code>将允许您知道先前提交到队列的所有块都已完成

但是,除非在调用
-logout
后(通过单独的同步),确保没有人向
数据队列提交新块,否则它不能确保队列实际上是空的


确保所有相关工作已完成的常用技术是使用与队列关联的调度组,并使用
dispatch\u group\u async()
将所有工作提交到队列。这允许您等待组中的所有工作通过
dispatch\u group\u wait()。然而,目前还不清楚这里需要的是取消,可能实际上需要完成
数据队列中的工作。。。