Шаблон для отмены подписки на внутренний поток после удаления объекта?

Насколько я понимаю Stream Dart, любые слушатели будут храниться в качестве ссылки до тех пор, пока не будет вызван StreamSubscription.cancel(). Это означает, что мои прослушиваемые объекты не будут удалены из памяти до тех пор, пока не будет уничтожен поток.

Существуют ли какие-либо стандартные шаблоны, обеспечивающие отмену всех внутренних прослушивателей, когда объект мне больше не нужен? Это даже проблема в Dart или я неправильно понимаю концепцию?

Одним из решений, которое я могу придумать, будет метод destroy или cancelSubscriptions, который нужно вызывать вручную, как только я узнаю, что объекты больше не нужны.


person Lucius    schedule 30.09.2014    source источник
comment
афаик, слабых событий в Дарте нет, как и отсутствующих слабых сетов и слабых карт. Все эти функции обязательно будут добавлены, вопрос в том, когда.   -  person GameAlchemist    schedule 03.10.2014


Ответы (1)


Если подписчик и экземпляр, ссылающийся на поток, подлежат сборке мусора (на который не ссылается какой-либо активный экземпляр), соединение не должно учитываться, и оба экземпляра должны быть удалены сборщиком мусора (но я не уверен в этом).

Я еще не видел шаблона.
Когда я просто хочу отменить все подписки, я сохраняю их в коллекции и запускаю

subscriptions.forEach(s) {
  s.cancel();
}
subscriptions.clear();

Когда я хочу отменить повторную подписку в разных ситуациях, я создаю переменную для каждой такой подписки.

var someSubscr = xxx.listen(...);

...

if(someSubscr != null) someSubscr.cancel();
someScubscr = null;

Я использовал это только в элементах Polymer, и я использую detached для отказа от подписки и attached для подписки.
Когда у меня есть потребность в других ситуациях, я просто добавляю вышеприведенный код в метод dispose и вызываю его, когда знаю, что он мне не понадобится. экземпляр больше.

Я думаю, было бы неплохо создать интерфейс и реализовать его для классов, которые должны иметь метод dispose.

abstract class Disposable {
  void dispose();
}

Если у вас есть какая-то фабрика, которая создает экземпляры для вас, и вы не уверены, нужен ли экземпляру вызов dispose, когда вы закончите его использовать, вы в безопасности, просто добавив эту строку.

if(x is Disposable) x.dispose();

Есть запрос функции, чтобы заставить виртуальную машину вызывать деструктор или метод удаления.

но неясно, будет ли это реализовано.

Также связаны:

person Günter Zöchbauer    schedule 30.09.2014
comment
Если еще нет стандартного способа сделать это, я буду рад сделать это по-своему. Интерфейс Disposable был именно тем, о чем я думал. Еще раз спасибо, товарищ Линцер! - person Lucius; 30.09.2014