清空调度异步队列 - 此代码如何工作?

时间:2014-08-21 17:02:56

标签: ios asynchronous grand-central-dispatch

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

.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, ^{});
}

我是以正确的方式做到的吗?我不想暂停队列然后恢复。

2 个答案:

答案 0 :(得分:2)

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

Grand Central Dispatch没有取消功能。您可能希望使用NSOperationQueue,它同样易于使用, 具有取消功能。

答案 1 :(得分:1)

dispatch_sync(dataQueue, ^{});中调用-logout可以让您知道之前提交到队列的所有块都已完成。

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

确保所有相关工作已完成的常用技巧是使用与队列关联的调度组,并使用dispatch_group_async()将所有工作提交到队列。这允许您等待组中的所有工作完成dispatch_group_wait(),或者通过dispatch_group_notify()在发生时通知(例如,触发某种类型的"异步注销"如果这很有意义。)