求助 状态机 dispatchEvent doEvent

看quick sample mvc 代码 有
doEvent

dispatchEvent

这俩函数有什么区别 我知道doEvent 会执行传入event name 会执行相应的callback

self:dispatchEvent({name = Actor.FIRE_EVENT})
dispatchEvent 这个函数是什么意思 dispatchEvent doEvent 有什么区别

UP UPUPUPUPUPUPUPUPUPUPUPUPUPUPUPUPUP

=====================================================================================

function ModelBase:ctor(properties)
cc(self):addComponent(“components.behavior.EventProtocol”):exportMethods()

self.isModelBase_ = true
if type(properties) ~= "table" then properties = {} end
self:setProperties(properties)

end

=====================================================================================

function EventProtocol:dispatchEvent(event)
event.name = string.upper(tostring(event.name))
local eventName = event.name
if DEBUG > 1 then
printInfo("%s dispatchEvent() - event %s", tostring(self.target_), eventName)
end

if self.listeners_ == nil then return end
event.target = self.target_
event.stop_ = false
event.stop = function(self)
    self.stop_ = true
end

for handle, listener in pairs(self.listeners_) do
    if DEBUG > 1 then
        printInfo("%s  dispatchEvent() - dispatching event %s to listener %s", tostring(self.target_), eventName, handle)
    end
    -- listener = listener
    -- listener = tag
    event.tag = listener
    listener(event)
    if event.stop_ then
        if DEBUG > 1 then
            printInfo("%s  dispatchEvent() - break dispatching for event %s", tostring(self.target_), eventName)
        end
        break
    end
end

return self.target_

end

=====================================================================================

Actor是继承ModelBase
由ModelBase:ctor可以看到他增加了EventProtocol的函数
Actor实际调用的是EventProtocol的dispatchEvent

可以看出他会去寻找所有监听事件为eventName的listener
然后派发事件 listener(event)

其他地方只要注册了eventName的都能收到派发出来的事件
mvc可能只是一个例子,里面并有有监听任何eventName
所以dispatchEvent只是派发了一个空函数需要自己去完善实现

关于doEvent是正对于状态机的,dispatchEvent是对于事件处理的
一个是告诉状态机改状态,一个是派发监听器事件

这是我的理解,如果没有说明文档,真相只有一句话:reading the fuck source code