我有一个要触发的事件,名为ValueGenerated。生成值和触发ValueGenerated的代码在线程中运行,并且接收此事件的方法在form.control(即表单)上。由于UI线程不允许其他线程更改UI,因此我在事件生成中编写了以下代码:
func getLength(buffer: AVAudioPCMBuffer) -> TimeInterval {
let framecount = Float64(buffer.frameCapacity)
let samplerate = buffer.format.streamDescription.pointee.mSampleRate
return TimeInterval(framecount / samplerate)
}
但我认为如果事件是由多个方法注册会发生什么。例如,通过两个或三个目的地。为什么在事件和委托类中我们只有Target属性返回最后一个方法的实例对象?我们总是只需要最后一个吗?
答案 0 :(得分:2)
你做错了。
如评论中所述,您可以通过在委托实例上调用GetInvocationList()
来获取调用目标的完整列表。然后,您可以单独调用每个目标。
但这是不正确的做法。您的活动应该对待所有处理程序。
如果事件是在后台线程中总是引发的事件,并且总是由UI对象处理,那么它应始终 使用适当的机制调度到UI线程。有关此类设计的示例,请参阅BackgroundWorker
类,特别是其ProgressChanged
和RunWorkerCompleted
事件。
如果其中任何一个条件不成立,那么您的事件不应尝试以任何方式处理跨线程调用。具有线程亲和力的事件的订阅者应该自己处理它。
不幸的是,在您的问题中没有足够的上下文来提供比这更具体的建议。唯一清楚的是你已经走上了一条死路。转身,回来,走更顺畅的路。 :)