В каком случаи отсоединяются от необходимых событий?

Так же, как упомянуто @NullVoxPopuli, это зависит от вашей версии ember, но я собираюсь предположить, что вы используете > 3 или более позднюю версию.

Мое первое замечание заключается в том, что я почти исключительно перешел к импорту и использованию функции get , которая, как и , определена в документации и очень хорошо описана. @Pavol в другом подобном посте , позволяет вам не знать, пытаетесь ли вы получить свойство для простого объекта javascript или объекта Ember.Object.

Чтобы ответить более прямо, я не уверен, что служба, на которую вы ссылаетесь, пытается выполнить, но основываясь на том, что вы написали, вы вполне могли бы просто позвонить get(this, 'maps.location') в вашем контроллере. и удалите или игнорируйте этот метод обслуживания.

В документации Ember также указывается, что, пока вы знаете метод, который вы хотите использовать из внедренного сервиса, вы можете просто вызывать его из текущего объекта Ember.Object без использования get; например:

export default Controller.extend({
    maps: service(),

    location: computed('maps.location', function() {
        return this.maps.getLocation()
    })...

Причина, по которой вы можете захотеть использовать get, заключается в том, что вы не уверены, что свойство, к которому вы обращаетесь, вычислено или нет.

Когда вы вызываете get для вычисляемого свойства, вызывается функция, и вместо самой функции возвращается возвращаемое значение.

BLOCKQUOTE>

16
задан Will Eddins 21 April 2009 в 19:22
поделиться

3 ответа

Я думаю, вы делаете это более сложным, чем нужно. Вам просто нужно запомнить две вещи:

  • Когда вы подписываетесь на событие, «владелец» (издатель) события обычно сохраняет ссылку на делегата, на которого вы подписаны.
  • Если вы используете метод экземпляра в качестве действия делегата, то у делегата есть ссылка на его «целевой» объект.

Это означает, что если вы напишите:

publisher.SomeEvent += subscriber.SomeMethod;

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

Обратите внимание, что во многих случаях подписчик является просто , этот :

publisher.SomeEvent += myDataTimer_Elapsed;

эквивалентен:

publisher.SomeEvent += this.myDataTimer_Elapsed;

при условии, что это экземпляр метод.

23
ответ дан 30 November 2019 в 21:20
поделиться

Соответствующий случай, когда вы должны отказаться от подписки на событие, выглядит следующим образом:

public class A
{
    // ...
    public event EventHandler SomethingHappened;
}

public class B
{
    private void DoSomething() { /* ... */ } // instance method

    private void Attach(A obj)
    {
       obj.SomethingHappened += DoSomething();
    }
}

В этом сценарии, когда вы избавляетесь от B, все равно будет свисающая ссылка на него из Обработчик событий obj . Если вы хотите освободить память B, вам нужно сначала отсоединить B.DoSomething () от соответствующего обработчика событий.

Вы можете столкнуться с тем же самым, если строка подписки на событие выглядит так , конечно:

obj.SomethingHappened += someOtherObject.Whatever.DoSomething();

Теперь это someOtherObject , который находится на крючке и не может быть собран мусором.

1
ответ дан 30 November 2019 в 21:20
поделиться

Оставшиеся ссылки, предотвращающие сборку мусора, имеют еще один эффект, который может быть очевиден, но тем не менее еще не заявлен в этом потоке; присоединенный обработчик событий также будет оправдан.

Я испытал это пару раз. Одним из них было, когда у нас было приложение, которое постепенно становилось медленнее и медленнее, чем дольше оно выполнялось. Приложение создавало пользовательский интерфейс динамически, загружая пользовательские элементы управления. Контейнер заставлял пользовательские элементы управления подписываться на определенные события в среде, и одно из них не отменялось после того, как элементы управления были «выгружены».

Через некоторое время это приводило к выполнению большого числа прослушивателей событий каждый раз, когда конкретное событие было поднято. Это, конечно, может привести к серьезным гоночным условиям, когда большое количество «спящих» экземпляры внезапно просыпаются и пытаются действовать на одном и том же входе.

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

3
ответ дан 30 November 2019 в 21:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: