如何检查事件是否尚未订阅?
我正在重构一个大型应用程序,尽管在该应用程序中我已经在Awake
中进行了订阅,但是从来没有任何取消订阅的调用,因此我想将订阅的调用移至OnEnable
并添加其相应的取消订阅。订阅呼叫进入OnDisable
,但被告知需要时将其留在Awake
中...
因此,我考虑过将其简单地添加到OnEnable
中,以为同时拥有它们并没有害处; 那安全吗?
private void Awake()
{
buttonManager.RepeatBetPressed += FinishWaiting;
}
private void OnEnable()
{
buttonManager.RepeatBetPressed += FinishWaiting;
}
private void OnDisable()
{
buttonManager.RepeatBetPressed -= FinishWaiting;
}
但是现在我想检查OnEnable
中的订阅是否已经在Awake
中完成。
除了下面的注释,我需要什么代码?
private void Awake()
{
buttonManager.RepeatBetPressed += FinishWaiting;
}
private void OnEnable()
{
if ( /* not already subscribed in awake */ )
{
buttonManager.RepeatBetPressed += FinishWaiting;
}
else
{
return;
}
}
private void OnDisable()
{
buttonManager.RepeatBetPressed -= FinishWaiting;
}
答案 0 :(得分:0)
考虑订阅的是操作:
if(buttonManager == null)
{
buttonManager.RepeatBetPressed += FinishWaiting;
}
并像这样称呼它:
buttonManager.RepeatBetPressed?.Invoke(); //...to avoid call it if it's null
答案 1 :(得分:0)
最简单的方法是使用标志来跟踪订阅状态。
private bool isSubed;
private void Awake()
{
buttonManager.RepeatBetPressed += FinishWaiting;
isSubed = true;
}
private void OnDestroy()
{
buttonManager.RepeatBetPressed -= FinishWaiting;
}
private void OnEnable()
{
if(isSubed) { return; }
buttonManager.RepeatBetPressed += FinishWaiting;
}
private void OnDisable()
{
buttonManager.RepeatBetPressed -= FinishWaiting; // Minus here to remove
isSubed = false;
}
private void FinishWaiting()
{
// If for any reason, your object is still subed but does not exist
if(this == null){ return; }
}
答案 2 :(得分:0)
作为接受的答案的替代方法,我通常要做的是始终在订阅之前取消订阅。
这是可能的,即使以前没有订阅,并确保已一次!
当您确保正确取消订阅时,您也不需要FinishWaiting
中的标志。
private void Awake()
{
buttonManager.RepeatBetPressed -= FinishWaiting;
buttonManager.RepeatBetPressed += FinishWaiting;
}
private void OnEnable()
{
buttonManager.RepeatBetPressed -= FinishWaiting;
buttonManager.RepeatBetPressed += FinishWaiting;
}
private void OnDisable()
{
buttonManager.RepeatBetPressed -= FinishWaiting;
}
private void OnDestroy()
{
buttonManager.RepeatBetPressed -= FinishWaiting;
}