2012-01-31 4 views
5

Я создал объекты, которые являются интерфейсами для веб-службы. Одним из типичных объектов будет «TaskService». Когда клиент использует один из этих объектов, он вызывает один из методов службы (например, «GetTasks»), и служба будет асинхронно удаляться, чтобы вызвать удаленный веб-сервис, и отправить обратно полученные данные через делегат.Синглтон с делегатом: хорошая идея или плохая?

В настоящее время для использования одной из этих служб вам необходимо создать ее с [[TaskService alloc] init], но я решил, что имеет смысл сделать каждую услугу единичным объектом.

Общеизвестно, что отдельные объекты, содержащие ссылки на делегатов, являются общими? Моя основная проблема с дизайном заключается в том, что каждый объект, когда он требует использования определенной службы, должен будет установить себя как делегат перед вызовом службы, что не кажется мне совершенно правильным ... Что делать, если другой объект должны были назначить себя делегатом между вами, назначив себя делегатом и вызывая службу?

Большое спасибо заранее!

С уважением, Ник

ответ

4

Имо это не является хорошей идеей, по той причине, что вы цитировали. Шаблон Singleton действительно для вещей, в которых есть только один, но похоже, что ваше приложение может понадобиться для нескольких экземпляров этих служб. Я думаю, что вам придется работать над этим (используя операционную очередь или какой-то делегатский мультиплексор), когда вам просто нужно создать несколько экземпляров вашего сервиса.

+0

Я понятия не имею, что такое мультиплексор делегата (какой-то вещатель?), Но для меня это слишком сложно, чтобы попробовать и реализовать, поэтому я постараюсь и не боюсь ничего подобного! Чтобы реализовать очередность операции, я был бы прав, думая, что каждый метод должен принимать делегат/параметр в качестве аргумента?Таким образом, «запросы» могут быть поставлены в очередь, а соответствующие делегаты должны быть вызваны после завершения? –

+0

Делегат-мультиплексор - это термин, который я только что составил для кода, который вы напишете внутри своего синглтона, чтобы выяснить, кому делегировать для отправки какого-либо данного результата. Операционная система намного лучше инкапсулирует каждую операцию (выборку и уведомление делегата). Так что да, запросы будут поставлены в очередь таким образом. – Rayfleck

4

Когда случай оправдывает использование объекта Singleton, я всегда избегаю делегирования по причине, которую вы цитируете. Потребители синглтона не могут знать (без какой-либо уродливой кодировки), если они наступают на некоторые другие пальцы потребителя, устанавливая себя как единственный и единственный делегат синглтона. NSNotifications - намного более чистый инструмент для работы; любое произвольное количество слушателей может потреблять уведомления, не заботясь о том, кто еще может слушать.

Делегирование работает лучше всего, когда есть четкое владение между классами. Никто не владеет синглом.

+0

Должен признаться, я не очень много знаю о NSNotifications, так что придется посмотреть на это. Похоже, что это может быть похоже на концепцию на других языках, которые я знаю, однако, где «слушатели» добавляются в список, и каждый слушатель уведомляется о некоторых событиях. Полагаю, это подойдет мне, поэтому спасибо за подсказку. –

+0

(Не ступать на носки Мэтта, но ...) Да, NSNotifications аналогичны слушателям (мы их называем наблюдателями). ИМО, если вы изучите только одну технику на этой неделе, это было бы так - они невероятно полезны, особенно в классах без связи и их соответствующих задачах. – Rayfleck

+0

Спасибо за подсказку. Я проверю NSNotifications сразу! –

0

Singleton на самом деле не проблема, вы вызываете такие же проблемы, просто создавая класс и передавая его как глобальную переменную. Как уже упоминалось, очередь - это возможность, или когда вы вызываете задачу на службе в вашем синглтоне, у нее есть экземпляр объекта TaskRequest, проходящего в методе и делегировании вызова, таким образом, запросы не могут попирать друг друга. На самом деле было бы неплохо сделать это с очередью в любом случае.

0

Объем одноэлементного цельного приложения. Например: рассмотрим пример торгового приложения, данные регистратора, идентификатор пользователя, который должен быть доступен в разных частях приложения, например, заказ, оплата, тележка и т. Д.

Делегаты используются для связи от 1 до 1, например: вы можете взять пример. У вас есть два телевизора с телевизором и устройством дистанционного управления. Вы хотите изменить канал телевизора. Делегирующие методы ТВ для изменения канала реализованы в классе устройств дистанционного управления. Таким образом, вы используете устройство дистанционного управления, и вы меняете канал телевизора.

Singleton используется для связи с несколькими приемниками, в то время как шаблон делегирования обычно используется для связи от 1 до 1.

Смежные вопросы