首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >DispatchSemaphore导致应用冻结,如何解决

DispatchSemaphore导致应用冻结,如何解决
EN

Stack Overflow用户
提问于 2021-01-04 21:05:39
回答 1查看 116关注 0票数 0

当我运行代码时,我点击iphone主页按钮,然后重新打开我的应用程序,我的应用程序冻结了。我感到不确定,为什么?

代码语言:javascript
代码运行次数:0
运行
复制
let queue = DispatchQueue(label: "com.aiswei.asw.monitior.search",qos: .default, attributes: .concurrent)
        let semaphore = DispatchSemaphore(value: 30)
        let minX = 2
        let maxX = 254
        self.index = minX
self.index = minX
        let count = maxX - minX + 1
        let lock = NSLock()
        for i in minX...maxX {
            queue.async {
                semaphore.wait()
                lock.lock()
                // request some server api  result
                 NetCenter.requestAPi { (result) in
                    semaphore.signal()
                }
            
                lock.unlock()
              
            }
        
        }
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-01-04 22:55:51

我预计这将尝试创建超过250个线程,这是您不想做的。也就是说,我怀疑真正的问题是在前台出现的问题是在其他地方;可能是在NetCenter。您可能会死锁主队列(特别是如果NetCenter是以相同的样式编写的)。

您可以通过在串行队列上使用单个DispatchWorkItem和您的信号量来实现相同的功能,而不是启动大量的DispatchWorkItems然后阻塞它们。串行队列将不再需要锁。它一次序列化30个操作,我认为这是您想要的。

代码语言:javascript
代码运行次数:0
运行
复制
    let queue = DispatchQueue(label: "com.aiswei.asw.monitior.search")
    let semaphore = DispatchSemaphore(value: 30)

    queue.async {
        let minX = 2
        let maxX = 254
        for _ in minX...maxX {
            semaphore.wait()
            NetCenter.requestAPi { (result) in
                semaphore.signal()
            }
        }
    }
}

在这里,我假设requestAPi是一个异步方法,它将在queue之外的某个队列上调度它的完成处理程序。(如果NetCenter使用与此函数相同的队列,则肯定会死锁。)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65563200

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档