检查是否已执行事件订阅

时间:2020-03-11 11:50:57

标签: c# unity3d

如何检查事件是否尚未订阅?

我正在重构一个大型应用程序,尽管在该应用程序中我已经在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;
}

3 个答案:

答案 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;
}