如何检查调度队列是否为空?
How can I check a dispatch queue is empty or not?
我的情况是,当我将 tableview 滚动到底部或顶部时,我需要重新加载、刷新作业,这会从服务器请求新数据,但我想检查最后一个作业是否完成与否。如果最后一个请求仍然有效,我不应该触发另一个请求。
我正在使用从 dispatch_queue_create() 创建的相同后台队列来处理 httpRequest。
- (id)init {
self = [super init];
if (self) {
...
dataLoadingQueue = dispatch_queue_create(@"DataLoadingQueue", NULL);
}
return self;
}
从现在开始,我只用一个布尔值来检测作业是否在工作。像这样:
if(!self.isLoading){
dispatch_async(dataLoadingQueue, ^{
self.isLoading = YES;
[self loadDataFromServer];
});
}
我只是想知道是否有任何方法可以将代码更改为如下所示:
if(isQueueEmpty(dataLoadingQueue)){
dispatch_async(dataLoadingQueue, ^{
[self loadDataFromServer];
});
}
因此,我可以删除随处显示且需要继续跟踪的令人讨厌的 BOOL 值。
为什么不改用 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;
});
当任务完成后,该组将为空并触发 dispatch_group_notify
中的通知块。
我的情况是,当我将 tableview 滚动到底部或顶部时,我需要重新加载、刷新作业,这会从服务器请求新数据,但我想检查最后一个作业是否完成与否。如果最后一个请求仍然有效,我不应该触发另一个请求。
我正在使用从 dispatch_queue_create() 创建的相同后台队列来处理 httpRequest。
- (id)init {
self = [super init];
if (self) {
...
dataLoadingQueue = dispatch_queue_create(@"DataLoadingQueue", NULL);
}
return self;
}
从现在开始,我只用一个布尔值来检测作业是否在工作。像这样:
if(!self.isLoading){
dispatch_async(dataLoadingQueue, ^{
self.isLoading = YES;
[self loadDataFromServer];
});
}
我只是想知道是否有任何方法可以将代码更改为如下所示:
if(isQueueEmpty(dataLoadingQueue)){
dispatch_async(dataLoadingQueue, ^{
[self loadDataFromServer];
});
}
因此,我可以删除随处显示且需要继续跟踪的令人讨厌的 BOOL 值。
为什么不改用 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;
});
当任务完成后,该组将为空并触发 dispatch_group_notify
中的通知块。