Подтвердить что ты не робот

Несколько делегатов в iOS

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

Существует несколько контроллеров, которые используют этот общий экземпляр, и мой вопрос заключается в том, как обратиться к правильному контроллеру представления, который запросил загрузку.

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

4b9b3361

Ответ 1

Я работал над проектами, в которых люди пытались использовать несколько делегатов, и это в основном плохая идея. Шаблон делегирования имеет отношение от 1 до 1 между классом и делегатом. Несмотря на то, что вы можете достичь некоторого уровня множественного делегирования путем переключения входящих и выходящих делегатов, это скорее приведет к непредсказуемому поведению и ошибкам.

Моя рекомендация - изменить то, как вы думаете об этом. У меня есть два варианта:

  • Переключитесь на шаблон Observer, где вы можете зарегистрировать несколько наблюдателей, с которыми может взаимодействовать ваш основной класс. Это полезно, когда ваши наблюдатели реализуют один и тот же протокол и где ваш основной класс хочет знать о наблюдателях и взаимодействовать с ними.

  • Трансляция NSNotifications для указания изменений состояния и событий. Вот более разборный подход, потому что основному классу не нужно знать, кто слушает и не взаимодействует напрямую с ними. Другие могут начать и перестать быть уведомлены на досуге. Это также имеет то преимущество, что вам не нужно создавать или реализовывать отдельный протокол. Вместо этого вы регистрируете классы, которые должны знать об изменениях в NSNotificationCenter, который по очереди обрабатывает всю маршрутизацию уведомлений для вас.

Ответ 2

На самом деле это похоже на то, что шаблон делегата, возможно, не лучший подход.

Вместо этого я бы посмотрел NSNotificationCenter.

Основная идея заключается в том, что ваш singleton, выполняющий сетевое соединение, отправляет уведомление (с чем-то вроде postNotificationName:object:userInfo:), говоря, что новые данные доступны. В рамках этого уведомления вы можете передать объект словаря (userInfo), который содержит данные, которые вы извлекли, или информацию о том, какие части вашей модели содержат обновленные данные.

Затем ваши другие контроллеры представлений могут зарегистрироваться для "наблюдения" этих уведомлений, вызвав addObserver:selector:name:object:. Вообще говоря, когда vc становится видимым, я вызываю addObserver и removeObserver, когда он скрывается или переводится.

Удачи!

Ответ 3

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

Ответ 4

Я рекомендую использовать один из этих способов.

наблюдатель:

когда данные использования, которые вы хотите сообщить другому объекту, близки к примитивным. Например, когда вы используете "NSMutableArray", вы не можете сообщить об изменении одного из объектов стандартным реализованным шаблоном, по крайней мере, вам нужно реализовать один для вашего "я", которое не может многократно использоваться

Уведомление

когда ваше взаимодействие с целевым объектом (те, которые необходимо сообщить) находится в one -way.it означает, что вам не нужны какие-либо подтверждения или другие данные от них.

делегат

когда на каждом шаге отображается один объект.

Примечание: использование блока для успеха и неудачи не является шаблоном для передачи данных, которые он собирается поставить в очередь, когда вы не знаете, когда они заканчивают или терпят неудачу, как сетевые операции.

EDIT:  как создать уведомление | проблемы и выполнение нескольких делегатов