代码之家  ›  专栏  ›  技术社区  ›  Marty Pitt

为什么使用ieventDispatcher.hasListener()?

  •  1
  • Marty Pitt  · 技术社区  · 15 年前

    我很好奇使用hasEventListener()而不是盲目地调度事件的性能优势?

    例如,我在flex框架代码片段中看到了以下内容:

    // from ArrayList.setItemAt()
    var hasCollectionListener:Boolean = hasEventListener(CollectionEvent.COLLECTION_CHANGE);
    if (hasCollectionListener)
    {
         dispatchEvent(new CollectionEvent(....))
    }
    

    我假设这推断出,如果没有人在监听,那么不调度事件会带来性能上的好处,而不是盲目地调度事件,不管是否连接了任何监听器。

    然而,这似乎没有意义。

    当然,监听器内部存储在某种性能散列图中。我本以为检查一个监听器是否存在,其性能与遍历空的监听器数组大致相同。

    因此,何必费心检查,而不只是盲目地调用 dispatchEvent 方法?原始代码示例明显比它们刚刚发送的事件更笨拙。

    当做,

    马蒂

    3 回复  |  直到 15 年前
        1
  •  0
  •   Brian Genisio    15 年前

    据我所知,运行这个检查是多余的。如果没有人在听,那么Listeners集合中就没有任何内容,因此 dispatchEvent 会很快…可能和询问是否有听众一样快…至少从宏级别。

    我想快速浏览一下分析程序可以肯定地告诉我们…这种类型的预优化只会引入更多的代码,因此会带来错误复制/粘贴的机会,除非您确定有一个pref 问题 这有助于缓解疼痛。

    有一些用途 hasEventListener 尽管打电话来。这样做是有道理的:

    if(hasEventListener("HeavyComputationChanged")) {
        doSomeHeavyComputation();
        dispatchEvent("HeavyComputationChanged");
    }
    
        2
  •  1
  •   Gerhard Schlager    15 年前

    即使没有注册事件侦听器,调度事件也会影响应用程序的性能。所以使用 hasEventListener() 被认为是最佳实践。

    关于这个主题,Adobe的BugTracker进行了一个长时间的讨论: http://bugs.adobe.com/jira/browse/SDK-24249

    简而言之:当你写作时 dispatchEvent(new Event("foo")) 类型为的新对象 Event 创建并调度事件。最后,gc会出现并从内存中删除事件对象。在事件仅触发几次的情况下,您不会注意到任何不同。如果绑定或其他事件被大量调度,则使用 HasEventListener()。 会有所不同。

    由于flex 4,使用[bindable]时编译器生成的代码始终使用 HasEventListener()。 在调度事件之前。

        3
  •  0
  •   adamk    15 年前

    接收方法是否调用event.stoppropagation()或event.stopImmediatePropagation()?

    我可以看到,如果他们不希望事件监听器冒泡到应用程序中的其他监听器,他们会想检查事件监听器是否在那里。如果监听器不在那里,它将无法阻止传播,直到它像另一个相同类型的组件一样弄乱其他东西!

    推荐文章