Delegate methods: There is NO magic. @cappuccino #cocoa
I have read many blogs and books about Cocoa and Cappuccino. Almost every one of them absolutely suck at explaining the Delegate design pattern used in Cocoa and Cappuccino. They say things like delegation describes “where an object, instead of performing one of its stated tasks, delegates that task to an associated helper object.” That’s as useful as an umbrella in a hurricane.
Let me put it simply. A delegate method is … wait for it … a method. That’s it. And what do you do with a delegate method. Frankly, anything you want your class to do when it receives that message. Again that’s it.
Certain Cocoa/Cappuccino classes have a property call delegate. They have statements that check to if delegate is not nil, and if it will respond to a certain message. If the answer to both of those is yes, it will send that particular message when it was programmed to send it.
For example, NSURLConnection/CPURLConnection is programmed to send the following message to its delegate:
[delegate connection:self didReceiveData:data];
Don’t believe me look at the source code, you will find that statement in there.
And there is nothing magical about it.
On the flip side, if you created a class and included the method;
– (void)connection:(CPURLConnection)connection didReceiveData:(CPString)data
and you set an instance of your class as CPURLConnection’s delegate, then at the right time the CPURLConnection instance will send your class that message.
Pay attention, this is tricky now. What should I put inside a delegate method? The answer: ANYTHING YOU WANT. More specifically anything that you want to execute when your class receives that message. Maybe you want to do something with the data, maybe you want a spinner to disappear, maybe you want to draw a pretty flower on your screen…it doesn’t matter.