2012-01-31 14 views
5

Ho creato oggetti che sono interfacce per un servizio web. Un oggetto tipico sarebbe un "TaskService". Quando un client utilizza uno di questi oggetti, richiama uno dei metodi del servizio (come "GetTasks") e il servizio si spegne in modo asincrono per chiamare il servizio Web remoto e postare i dati recuperati tramite un delegato.Singleton con un delegato: buona idea o cattiva?

Attualmente, per utilizzare uno di questi servizi è necessario crearlo con [[TaskService alloc] init], ma ho deciso che ha più senso rendere ciascun servizio un oggetto singleton.

È comune vedere oggetti singleton che contengono riferimenti ai delegati? Il mio problema principale con il design, è che ogni oggetto, ogni volta che richiede l'uso di un particolare servizio, dovrà impostarsi come delegato prima di richiamare il servizio, il che non mi sembra del tutto corretto ... E se un altro oggetto dovevi porsi come delegato tra te e te stesso come delegato e invocando il servizio?

Molte grazie in anticipo!

saluti, Nick

risposta

4

Imo questa non è una buona idea per la ragione che hai citato. Il pattern Singleton è davvero per le cose ce ne sono solo una, ma sembra che la tua app possa aver bisogno di più istanze di questi servizi. Penso che avresti finito di lavorare su questo (usando una coda di operazioni o qualche tipo di multiplexer delegato) quando hai veramente bisogno di istanziare più istanze del tuo servizio.

+0

Non ho idea di cosa sia un multiplexer delegato (autore di una sorta di emittente?), Ma sembra troppo complicato da provare e implementare, quindi cercherò di stare alla larga da qualsiasi cosa del genere! Per implementare una coda di operazioni, avrei ragione nel ritenere che ogni metodo avrebbe dovuto prendere un delegato/parametro come argomento?Quindi le "richieste" potrebbero essere accodate, con i delegati associati da chiamare una volta completati? –

+0

Un multiplexer delegato è un termine che ho appena inventato per il codice che avresti scritto all'interno del tuo singleton per capire a quale delegato inviare un dato risultato. Un operazione potrebbe incapsulare molto meglio ogni operazione (un recupero e una notifica del delegato). Quindi sì, le richieste sarebbero accodate in questo modo. – Rayfleck

4

Quando l'occasione garantisce l'uso di un oggetto Singleton, evito sempre la delega per il motivo che citi. I consumatori di un singleton non possono sapere (senza qualche brutta codifica) se stanno calpestando le dita di altri consumatori impostandosi come il delegato unico e solo del singleton. NSNotifications sono uno strumento molto più pulito per il lavoro; qualsiasi numero arbitrario di ascoltatori può consumare le notifiche senza preoccuparsi di chi altro può ascoltare.

La delega funziona meglio quando c'è una chiara proprietà tra le classi. Nessuno possiede un singleton.

+0

Devo ammettere che non so molto su NSNotifications, quindi dovrò cercarlo. Sembra che potrebbe essere simile a un concetto in altri linguaggi che conosco, tuttavia, in cui "gli ascoltatori" sono aggiunti a una lista e ciascun ascoltatore viene informato su determinati eventi. Questo mi andrebbe bene, penso, quindi grazie per il suggerimento. –

+0

(Non calpestare le dita dei piedi di Matt ma ...) sì, le NSNotifiche sono analoghe agli ascoltatori (noi li chiamiamo osservatori). IMO, se impari una sola tecnica questa settimana, sarebbe - sono incredibilmente utili, specialmente nelle classi di disaccoppiamento e nei loro rispettivi compiti. – Rayfleck

+0

Grazie per il suggerimento. Controllerò immediatamente NSNotifications! –

0

Singleton non è proprio il problema, si causa lo stesso tipo di problemi semplicemente istanziando una classe e trasmettendola come una variabile globale. Come altri hanno menzionato una coda è una possibilità, o quando si richiama un'attività su un servizio nel Singleton si ha istanza un oggetto TaskRequest che passa nel metodo e il delegato di richiamata, in questo modo le richieste non possono calpestarsi l'una sull'altra. In effetti sarebbe una buona idea farlo comunque con una coda.

0

L'ambito di un singleton è l'intera applicazione. Ad esempio: Considera l'esempio dell'applicazione shopping i dati del logger, l'ID utente about che deve essere accessibile su diverse parti dell'applicazione come ordine, pagamento, carrello ecc.

I delegati vengono utilizzati per la comunicazione 1 a 1, per esempio: puoi prendere come esempio Hai due classi TV e dispositivo di controllo remoto. Vuoi cambiare il canale della TV. I metodi delegati di TV per cambiare canale sono implementati nella classe di dispositivi di controllo remoto. Quindi usi il telecomando e cambi il canale della TV.

Il singleton viene utilizzato per comunicare con più ricevitori, mentre il pattern di delega viene utilizzato in genere per la comunicazione 1 a 1.

Problemi correlati