This section should probably also explain the concept of the subscriber, ie. the thing you need to unregister for the announcement to stop being sent.

For message sends (on:send:to:) it is the receiver (to: argument), for blocks (on: do:) it's the object where block is defined. #on:do:for:/#when:do:for, which lets you specify another object as subscriber for block actions, is currently not implemented. It's also a difference from the VW implementation, where when:do: uses the action block itself as subscriber, so you're much more likely to need on:do:for:.

Cheers,
Henry


On 18.04.2011 11:13, Henrik Sperre Johansen wrote:
On 18.04.2011 10:47, Fernando Olivero wrote:
To remove the subscription you can evaluate: World announcer initialize.

Maybe the tutorial should add (pesudo code):

MyStuff>>initialize
         World announcer
                 on: WindowOpened
                 send: #showOnTranscript
                 to: self
         SystemAnnouncer on:#classremove send:#release: to: self.

MyStuff>>release: anAnn
         World announcer unsuscribe: self.

MyStuff>>showOnTranscript
      Transcript show: 'A new window was opened';cr

I can update the tutorial if people agrees on the pseudo code.


To open a transcript evaluate: TranscriptMorph openWindow
(decoupled Transcript from Morphic, so directly ask the view to open itself)

Fernando

The old tutorial was weak mainly because it didn't tell you how to unsubscribe.


Here's a few examples of that:

"Unsubscribe automatically with weak announcements."
World announcer weak
    on: WindowOpened
    send: #shownOnTranscript
    to: self.

Then example in Workspace
obj := self new.
"Open a window, and see Transcript printing"
obj := nil.
"Open a window, you may see Transcript printing (depending on finalization)"
"Now force finalization"
Smalltalk garbageCollect.
"Open a window, now see no transcript prints."


"Automatically unregister after handling one announcement"
initialize
World announcer
    on: WindowOpened
    do: [:ann: announcer | self shownOnTranscript.
    announcer unsubscribe: self.]

"Unregister specifically after some time"
initialize
    World announcer
        on: WindowOpened
        send: #shownOnTranscript
        to: self.

release
    World announcer unsubscribe: self.

"Using same action block registered for multiple announcers, unregister specifially at a specific time"
initialize
    handlesAnnoucements := true.
    actionBlock:= [:ann :announcer |
        handlesAnnouncement
             ifTrue: [self shownOnTranscript]
            ifFalse: [announcer unsubscribe: self]].
     World announcer on: WindowOpened do: actionBlock.
     AnnouncerTest announcer on: TestCaseEnded do: actionBlock.

release
    handlesAnnouncements := false.








Reply via email to