我正在进行异步请求调用,如下所示:
.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, ^{});
}
我是以正确的方式做到的吗?我不想暂停队列然后恢复。
答案 0 :(得分:2)
logout
中的代码不会清空队列,只是在它的末尾附加一个空块。
Grand Central Dispatch没有取消功能。您可能希望使用NSOperationQueue
,它同样易于使用, 具有取消功能。
答案 1 :(得分:1)
在dispatch_sync(dataQueue, ^{});
中调用-logout
可以让您知道之前提交到队列的所有块都已完成。
但是,除非确保在调用dataQueue
之后没有人向-logout
提交新块,否则它不会确保队列实际上是空的。(可能是通过单独的同步)。
确保所有相关工作已完成的常用技巧是使用与队列关联的调度组,并使用dispatch_group_async()
将所有工作提交到队列。这允许您等待组中的所有工作完成dispatch_group_wait()
,或者通过dispatch_group_notify()
在发生时通知(例如,触发某种类型的"异步注销"如果这很有意义。)