Проверка выполнения подписки на событие - PullRequest
0 голосов
/ 11 марта 2020

Как проверить, если на событие еще не подписана?

Я занимаюсь рефакторингом большого приложения, в котором у меня есть подписка на 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 ]

1 голос
/ 11 марта 2020

Самый простой способ - использовать флаг для отслеживания состояния подписки.

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; } 
}
1 голос
/ 11 марта 2020

В качестве альтернативы принятому ответу, я обычно просто отписываюсь перед подпиской.

Это возможно, даже если он не был подписан ранее и обеспечивает максимальную подписку один раз !

Вам также не нужен флаг в 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;
}
1 голос
/ 11 марта 2020

С учетом подписок действуют:

if(buttonManager == null)
{
        buttonManager.RepeatBetPressed += FinishWaiting;
}

И называйте это как:

buttonManager.RepeatBetPressed?.Invoke(); //...to avoid call it if it's null
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...