美文网首页
[iOS] 信号量的巧妙使用

[iOS] 信号量的巧妙使用

作者: manajay | 来源:发表于2018-05-29 14:43 被阅读222次

    场景: 有个同步任务, 将所有的操作步骤,设置为 枚举, 根据枚举 +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;
    }
    

    交流

    如果有更好的方式, 请联系我

    相关文章

      网友评论

          本文标题:[iOS] 信号量的巧妙使用

          本文链接:https://www.haomeiwen.com/subject/rrqajftx.html