如何检查调度队列是否为空?

林鼎棋*_*林鼎棋 5 queue multithreading grand-central-dispatch ios is-empty

我的条件是,当我将tableview滚动到底部或顶部时,我需要做一些重新加载,刷新作业,从服务器请求新数据,但我想检查上一个作业是否完成.如果最后一个请求仍然有效,我不应该发出另一个请求.

我正在使用从dispatch_queue_create()创建的相同后台队列来处理httpRequest.

- (id)init {
    self = [super init];
    if (self) {
        ...
        dataLoadingQueue = dispatch_queue_create(@"DataLoadingQueue", NULL);
    }
    return self;
}
Run Code Online (Sandbox Code Playgroud)

从现在开始,我只使用BOOL值来检测作业是否正在工作.像这样的东西:

if(!self.isLoading){

    dispatch_async(dataLoadingQueue, ^{

        self.isLoading = YES;
        [self loadDataFromServer];

    });

}
Run Code Online (Sandbox Code Playgroud)

我只是想知道是否有任何方法可以将代码更改为如下所示:

if(isQueueEmpty(dataLoadingQueue)){

    dispatch_async(dataLoadingQueue, ^{

        [self loadDataFromServer];

    });

}
Run Code Online (Sandbox Code Playgroud)

因此,我可以删除显示在任何地方并需要继续跟踪的烦人的BOOL值.

小智 5

你为什么不改用NSOperationQueue(检查[operationQueue operationCount])?

如果您只想使用GCD,dispatch_group_t可能适合您.

@property (atomic) BOOL isQueueEmpty;
dispatch_group_t dispatchGroup = dispatch_group_create();
dispatch_group_async(dispatchGroup, dataLoadingQueue, ^{
    self.isQueueEmpty = NO;
    //Do something
});

dispatch_group_notify(dispatchGroup, dataLoadingQueue, ^{
    NSLog(@"Work is done!");
    self.isQueueEmpty = YES;
});
Run Code Online (Sandbox Code Playgroud)

任务完成后,该组将为空并触发通知块dispatch_group_notify.