#swift #singleton #protocols #delegation
Вопрос:
У меня есть синглтон под названием GameCenterFacade. В моем контроллере просмотра домашней страницы приложения я установил:
GameCenterFacade.shared.delegate = self
Затем я использую тот же код в пользовательском классе, который является переменной экземпляра контроллера просмотра домашней страницы. Это, по-видимому, обновляет общий делегат GameCenterFacades, чтобы он был переменной экземпляра, а не контроллером просмотра. В результате метод протокола вызывается только в пользовательском классе, а не в ViewController.
Есть ли разумный способ обойти это, где вы можете установить как контроллер представления, так и пользовательский класс переменной экземпляра в качестве одноэлементного делегата GameCenterFacade? Я думаю, потому что это синглтон, у него может быть только 1 делегат?
Комментарии:
1. Может быть, вам нужно решение для публикации/подписки?
Ответ №1:
Шаблон проектирования делегата-это шаблон «один к одному». У любого данного объекта есть только один делегат.
Тем не менее, было бы не так сложно создать свой собственный шаблон с несколькими делегатами. Дайте объекту, у которого вы хотите иметь несколько делегатов (назовем их множественными делегатами), массив объектов делегатов. Пусть его метод инициализации создаст пустой массив multiDelegates
.
Дайте объекту, который управляет массивом с несколькими сегментами, метод addDelegate и метод removeDelegate. фактически, создайте мультиэлементный протокол, который определяет эти методы.
В GameCenterFacade, когда он идет уведомлять клиентов об интересных событиях, пусть он просматривает свой массив множественных сегментов и уведомляет каждого по очереди.
В качестве альтернативы вы можете использовать шаблон публикации/подписки или Центр уведомлений.