2012-01-31 19 views
5

Utworzono obiekty będące interfejsami do usługi WWW. Typowym obiektem byłoby "TaskService". Gdy klient używa jednego z tych obiektów, wywołuje jedną z metod usługi (takich jak "GetTasks"), a usługa asynchronicznie wyrusza w celu wywołania zdalnej usługi WWW i odsyła pobrane dane przez delegata.Singleton z delegatem: Dobry pomysł czy zło?

Obecnie, aby skorzystać z jednej z tych usług, trzeba ją utworzyć przy pomocy [[TaskService alloc] init], ale zdecydowałem, że bardziej sensownym jest uczynienie każdej usługi pojedynczym obiektem.

Czy często można zobaczyć obiekty singleton, które zawierają odniesienia do delegatów? Moim głównym problemem związanym z projektem jest to, że każdy obiekt, kiedy wymaga użycia określonej usługi, będzie musiał ustawić się jako delegat przed wywołaniem usługi, co nie wydaje mi się całkiem słuszne ... Co jeśli inny obiekt mieli się ustawić jako delegat między wami, ustawiając siebie jako delegata i wywołując usługę?

Wielkie dzięki z góry!

Pozdrawiam, Nick

Odpowiedz

4

Imo to nie jest dobry pomysł dla powodu cytowane. Wzorzec Singleton jest tak naprawdę dla rzeczy, które są tylko jednym z nich, ale wygląda na to, że Twoja aplikacja może potrzebować wielu wystąpień tych usług. Sądzę, że skończyłbyś się tym zajmować (używając kolejki operacji lub jakiegoś rodzaju multipleksera delegowanego), gdy naprawdę potrzebujesz tylko utworzyć instancję wielu instancji twojej usługi.

+0

Nie mam pojęcia, czym jest multiplekser delegatów (nadawca jakiegoś rodzaju?), Ale wydaje mi się to zbyt skomplikowane, abym mógł je wdrożyć, więc postaram się pozostać z dala od czegoś takiego! Aby zaimplementować kolejkę operacji, czy miałbym rację myśląc, że każda metoda musiałaby przyjąć argument/argument jako delegat?Tak więc "wnioski" mogą być umieszczane w kolejce, a towarzyszący im delegaci zostaną wezwani po zakończeniu? –

+0

Powszechny multiplekser to termin, który właśnie wymyśliłem dla kodu, który napiszesz w swoim singletonie, aby dowiedzieć się, któremu delegatowi wysłać dowolny wynik. Operacja op que mogłaby lepiej zamknąć każdą operację (pobranie i powiadomienie delegata). Więc tak, wnioski będą w kolejce w ten sposób. – Rayfleck

4

Kiedy okazja gwarantuje użycie obiektu Singleton, zawsze unikam delegowania z tego powodu, który cytujesz. Konsumenci singletonu nie mogą wiedzieć (bez jakiegoś brzydkiego kodowania), jeśli wkraczają na palce innego konsumenta, ustawiając siebie jako jedynego i jedynego delegata singletona. NSNotifications to znacznie czystsze narzędzie do pracy; dowolna liczba słuchaczy może spożywać powiadomienia bez dbania o to, kto może słuchać.

Delegatura działa najlepiej, gdy istnieje wyraźna własność między klasami. Nikt nie jest właścicielem singletonu.

+0

Muszę przyznać, że tak naprawdę nie wiem zbyt wiele o NSNotifications, więc będę musiał to sprawdzić. Brzmi to tak, jakby był podobny do pojęcia w innych językach, które znam, gdzie "słuchacze" są dodawani do listy, a każdy słuchający jest powiadamiany o pewnych zdarzeniach. To by mi odpowiadało, tak myślę, dzięki za napiwek. –

+0

(Nie wchodzić na palce Matta, ale ...) tak, NSNotification są analogiczne do słuchaczy (nazywamy ich obserwatorami). IMO, jeśli nauczysz się tylko jednej techniki w tym tygodniu, to jest to - są one niezwykle użyteczne, szczególnie w klasach niezwiązanych ze sobą i ich zadaniach. – Rayfleck

+0

Dzięki za cynk. Natychmiast sprawdzę NSNotifications! –

0

Singleton nie jest tak naprawdę problemem, powoduje to ten sam rodzaj problemów, po prostu publikując klasę i przekazując ją jako zmienną globalną. Jak już wspomniano, kolejka jest opcją, lub gdy wywołujesz zadanie w usłudze w Singletonie, musisz przekazać obiektowi obiekt TaskRequest w metodzie i delegacie wywołania, w ten sposób żądania nie mogą deptać się nawzajem. W rzeczywistości dobrym pomysłem byłoby zrobienie tego w kolejce.

0

Zakres singletonu to cała aplikacja. Na przykład: Rozważ przykład aplikacji do zakupów danych rejestratora, o identyfikatorze użytkownika, który musi być dostępny w różnych częściach aplikacji, takich jak zamówienie, płatność, koszyk itp.

Delegaci są używane do komunikacji 1 do 1, na przykład: Możesz wziąć jako przykład Masz dwie klasy TV i urządzenie zdalnego sterowania. Chcesz zmienić kanał TV. Metody delegowania telewizji do zmiany kanału realizowane są w klasie urządzeń zdalnego sterowania. Używasz więc urządzenia zdalnego sterowania i zmieniasz kanał telewizora.

Singleton służy do komunikacji z wieloma odbiorcami, a schemat delegacji jest zwykle używany do komunikacji od 1 do 1.

Powiązane problemy