场景: 有个同步任务, 将所有的操作步骤,设置为 枚举, 根据枚举 +1 去递进 操作方法, (方法中返回 YES, NO 来决定是否 + 1),
但是其中一个操作ENUMStep4ConCurrent
是要异步
处理大量的网络请求和 IO 操作,
所以 做了一个标记位, 会递归调用ENUMStep5
来确认这个异步的操作是否完成了, 并且刷新进度
但是因为是 递归,所以导致CPU
负担过重 !!!!
typedef NS_ENUM(NSUInteger, ENUMStep) {
ENUMStep1,
ENUMStep2,
ENUMStep3,
ENUMStep4ConCurrent,
ENUMStep5,
ENUMStep6,
ENUMStep7,
};
解决办法
- 创建一个信号量
- (dispatch_semaphore_t)checkAsycSemaphore {
if (_checkAsycSemaphore == nil) {
_checkAsycSemaphore = dispatch_semaphore_create(0);
}
return _checkAsycSemaphore;
}
- 在异步
ENUMStep4ConCurrent
的小步骤中, 每当完成一个网络请求或者是 IO 操作, 即 发送信号
dispatch_semaphore_signal(self.checkAsycSemaphore)
- 这样在
ENUMStep5
中 去等待信号量 执行方法
- (BOOL)stepWithENUMStep5 {
dispatch_semaphore_wait(self.checkAsycSemaphore, DISPATCH_TIME_FOREVER);
NSLog(@"信号量的方式, 只有让 有图片下载结束后 才计算进度");
return _downloadAllImage;
}
交流
如果有更好的方式, 请联系我
网友评论