Rispondo alla domanda di ILeW con un articolo vero e proprio per spiegare meglio, allegando esempio, come funzionano delegati e notifiche. Usando uno schema vediamo prima di tutto come funziona il pattern delegato:

Un oggetto in cerca di un delegato
In pratica il pattern prevede che un oggetto (il delegante) esponga un solo punto d’ingresso tramite il quale un secondo oggetto (il delegato) potrà ricevere messaggi/notifiche dal delegante:

Delegante e delegato
È importante capire che la comunicazione tra delegante e delegato avviene tramite un protocollo. Tale protocollo è definito dall’oggetto principale (il delegante) e dev’essere conosciuto dal delegato. Nell’esempio che ho allegato ho usato il seguente schema:

Esempio delegato
Lasciatemi mostrare in sequenza i passi a livello di codice:
- Ho definito una mia classe UIView
1@interface DelegateView : UIView
- Ho creato una proprietà
delegate1
2
3
4
5@interface DelegateView : UIView {
@private
__weak id<DelegateViewProtocol> delegate;
}
@property(nonatomic, weak) id<DelegateViewProtocol> delegate; - Ho definito un mio protocollo
1
2
3
4
5
6
7
8
9
10
11
12@protocol DelegateViewProtocol;
@interface DelegateView : UIView {
@private
__weak id<DelegateViewProtocol> delegate;
}
@property(nonatomic, weak) id<DelegateViewProtocol> delegate;
@end
@protocol DelegateViewProtocol <NSObject>
@optional
- (void)messaggio;
@end - Nel view controller ho incluso la classe UIView
1#import "DelegateView.h"
- Ho adottato il protocollo
1
2
3#import "DelegateView.h"
@interface ViewController : UIViewController <DelegateViewProtocol>
@end - Ho creato la UIView e gli ho indicato me stesso come delegato
1
2
3
4
5
6
7
8
9- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
DelegateView *dView = [[DelegateView alloc] initWithFrame:CGRectMake(100., 100., 300., 300.)];
[self.view addSubview:dView];
dView.delegate = self;
} - Quando si clicca sul bottone della UIView
1
2
3
4
5
6- (void)buttonDidClicked:(UIButton *)sender
{
if (delegate && [delegate respondsToSelector:@selector(messaggio)]) {
[delegate messaggio];
}
} - Viene ricevuto il messaggio nel view controller
1
2
3
4
5#pragma mark - DelegateViewProtocol
- (void)messaggio
{
NSLog(@"%s", __FUNCTION__);
}
Per concludere, ragionando sempre a schemi, le notifiche diversamente usano una sorta di intermediario. Il delegante, in pratica, non comunica direttamente con il delegato, ma sfrutta una sovrastruttura che ha il compito di ricevere e inviare messaggi:

Notifiche
Qui la situazione è totalmente diversa. In realtà non esiste un vero e proprio delegante e delegato. I ruoli potrebbe essere invertiti o sussistere entrambi contemporaneamente. Il Centro Notifiche fa da tramite, prende in carico i messaggi che gli oggetti gli inviano e li inoltra a gli oggetti che si sono registrati per riceverli. Quindi tutti possono inviare e tutti possono ricevere, senza limite di numero.
Questa situazione è ovviamente diversa dal pattern delegato dove, come visto sopra, può esistere un solo delegato per delegante – pena inserire delegate2, delegate3, etc… cosa ovviamente orrenda e non proponibile.
L’unica cosa che hanno in comune i due approcci è la possibilità, anche per il pattern delegato, di far comportare un oggetto sia come delegante che come delegato contemporaneamente.








7
Non ci sono commenti per questo Post
Lascia un commento