Делегат Swift установлен на одном элементе в 2 местах

#swift #singleton #protocols #delegation

Вопрос:

У меня есть синглтон под названием GameCenterFacade. В моем контроллере просмотра домашней страницы приложения я установил:

 GameCenterFacade.shared.delegate = self
 

Затем я использую тот же код в пользовательском классе, который является переменной экземпляра контроллера просмотра домашней страницы. Это, по-видимому, обновляет общий делегат GameCenterFacades, чтобы он был переменной экземпляра, а не контроллером просмотра. В результате метод протокола вызывается только в пользовательском классе, а не в ViewController.

Есть ли разумный способ обойти это, где вы можете установить как контроллер представления, так и пользовательский класс переменной экземпляра в качестве одноэлементного делегата GameCenterFacade? Я думаю, потому что это синглтон, у него может быть только 1 делегат?

Комментарии:

1. Может быть, вам нужно решение для публикации/подписки?

Ответ №1:

Шаблон проектирования делегата-это шаблон «один к одному». У любого данного объекта есть только один делегат.

Тем не менее, было бы не так сложно создать свой собственный шаблон с несколькими делегатами. Дайте объекту, у которого вы хотите иметь несколько делегатов (назовем их множественными делегатами), массив объектов делегатов. Пусть его метод инициализации создаст пустой массив multiDelegates .

Дайте объекту, который управляет массивом с несколькими сегментами, метод addDelegate и метод removeDelegate. фактически, создайте мультиэлементный протокол, который определяет эти методы.

В GameCenterFacade, когда он идет уведомлять клиентов об интересных событиях, пусть он просматривает свой массив множественных сегментов и уведомляет каждого по очереди.

В качестве альтернативы вы можете использовать шаблон публикации/подписки или Центр уведомлений.