首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何快速终止调度队列的异步执行?

如何快速终止调度队列的异步执行?
EN

Stack Overflow用户
提问于 2018-02-23 21:11:32
回答 2查看 123关注 0票数 0

我目前正在使用粒子的API进行事件流,我希望在某个未知的时间点终止事件订阅(我知道有一个用于定时终止的接口)。

代码语言:javascript
复制
ParticleCloud.sharedInstance().subscribeToAllEvents(withPrefix: prefix, handler: { (eventOpt :ParticleEvent?, error : Error?) in
            if let _ = error {
                eprint (message: "Could not subscribe to events")
            } else {
                let serialQueue = DispatchQueue(label: "foo")
                serialQueue.async(execute: {
                    ...
                })
            }
        })

据我所知,DispatchQueue对象从池中获取空线程,并运行我省略的函数(因为它与问题无关)。我希望稍后结束.async调用,因为它现在正在无限期地运行。

我查看了堆栈溢出,以寻找稍后挂起或恢复调度队列的可能性,例如:

代码语言:javascript
复制
ParticleCloud.sharedInstance().subscribeToAllEvents(withPrefix: prefix, handler: { (eventOpt :ParticleEvent?, error : Error?) in
            if let _ = error {
                eprint (message: "Could not subscribe to events")
            } else {
                let serialQueue = DispatchQueue(label: "foo")
                serialQueue.async(execute: {
                    ...
                })
                serialQueue.suspend() // EXC_BAD_INSTRUCTION
            }
        })

但它导致了一个EXC_BAD_INSTRUCTION。诊断(无对象等)无帮助。

不幸的是,我不知道如何给出这个问题的MVCE示例,因为它需要粒子硬件和particle.io上的注册帐户,因此我对此表示歉意。

subscribeToAllEvents的API在这里:https://docs.particle.io/reference/ios/#events-sub-system

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-02-23 21:26:55

引用subscribeToAllEventsWithPrefix:handler:的文档

返回:为了删除事件侦听器, eventListenerID函数将返回id类型对象,作为eventListener注册唯一的ID保持并将该对象传递给取消订阅方法。

它编写得令人费解,但要点是订阅函数返回一个对象。应该将对象保留在实例属性中。准备取消订阅时,将对象传递给取消订阅函数。

所以:

代码语言:javascript
复制
// Instance property.
var subscription: Any?

subscription = ParticleCloud.sharedInstance().subscribeToAllEvents(withPrefix: prefix, handler: { ... })

// When it's time to unsubscribe...
if let subscription = subscription {
    ParticleCloud.sharedInstance().unsubscribeFromEvent(withID: subscription)
    self.subscription = nil
}
票数 1
EN

Stack Overflow用户

发布于 2018-02-23 21:24:53

最简单的方法是使用OperationQueue而不是DispatchQueue。向队列中添加一个BlockOperation并保持对该操作的引用,然后您可以在操作上调用cancel以阻止它执行(但是,如果操作已经启动,这不会停止它,因此如果需要考虑这个问题,您可以定期检查它的isCancelled属性,如果它找到true就提前退出)。

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

https://stackoverflow.com/questions/48956274

复制
相关文章

相似问题

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