Как избежать дублирования подписки в Rx Subject - PullRequest
1 голос
/ 26 мая 2020

У меня есть способ, в котором просто различные клиенты подписываются на эту тему. Я просто хочу справиться с ситуацией, когда кто-то случайно не подписывается несколько раз. Итак, перед подпиской мне нужно проверить, есть ли у субъекта подписка для того же клиента, а затем ничего не делать. Я проверил с помощью метода linq под названием Distinct, но он возвращает только одного наблюдателя. Я думаю, для этого нужен прямой способ? Если кто знает, поделитесь тем же

class SettingManger
{
   private Subject<string> suject = new Subject<string>();

           public IDisopable SubscribeToChange(IObserver<string>subscriber)
          {
             return subject.subscribe(subscriber);
          }
}

1 Ответ

0 голосов
/ 26 мая 2020

создать карту и использовать ее для определения дубликатов.

ниже пример в стиле машинописного текста.

class SettingManger
{
  private map = new Map<any, Subscription>();
  private Subject<string> suject = new Subject<string>();

  public IDisopable SubscribeToChange(IObserver<string>subscriber)
  {
    // killing a dead subscription
    if (this.map.has(subscriber) && this.map.has(subscriber).closed) {
      this.map.remove(subscriber);
    }

    // subscribing
    if (!this.map.has(subscriber)) {
      this.map.set(subscriber, subject.subscribe(subscriber));
    }

    // sharing pointer
    return this.map.get(subscriber);
  }
}

но это очень легко взломать, создав функцию стрелки.

...