如何在Swift中终止异步派遣队列的执行



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

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: {
                    ...
                })
            }
        })

据我所知,Swift中的DispatchQueue对象从池中取空线程并运行我省略的功能(因为它与问题无关(。我想要某种方法来稍后结束.async调用,因为它现在无限期地运行。

我环顾堆栈溢出,以便稍后暂停或恢复调度队列的可能性,例如:

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示例,因为它需要粒子硬件和eNCTRAIN.IO上的注册帐户,所以我对此表示歉意。

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

引用 subscribeToAllEventsWithPrefix:handler:的文档:

返回: EventListenerId函数将返回ID类型对象,为EventListener注册唯一ID-并将此对象传递给Unsubscribe方法,以删除此事件侦听器

它是令人困惑的书写,但要旨是订阅函数返回对象。您应该将对象保存在实例属性中。当您准备退订时,将对象传递给退订函数。

so:

// 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
}

最简单的方法是使用OperationQueue而不是DispatchQueue。在队列中添加BlockOperation并保留对操作的引用,然后您可以在操作中调用cancel以防止其执行(如果操作已经启动,但是,这将不会停止它,因此,如果这是一个担心您可能会定期检查其isCancelled属性并提前退出,如果找到true(。

最新更新