2015-09-25 4 views
0

В моем приложении iOS многие ViewControllers должны будут отправлять/получать данные с сервера на основе ввода и действий пользователя. Я собираюсь использовать NSURLSession для всех своих сетевых действий. Но я не хочу, чтобы каждый ViewController соответствовал протоколу NSURLSession и повторял все методы.Совместное использование делегирования NSURLsession среди контроллеров просмотров

Я вижу два решения

  • Создать класс, который соответствует делегату протокола NSURLSession. Другие классы создают экземпляр этого класса и используют его методы для отправки/получения данных с сервера. Повторное использование класса, управляющего всей сетью, будет выполнено с использованием шаблона проектирования singleton, перегружая его метод init таким образом, чтобы был создан только его экземпляр.

    • Недостаток этого подхода состоит в том, что наличие синглов делает сложным создание единичных тестов, которые полностью получают функциональность каждого класса, изолированного от других. I.e. Предположим, что ошибка происходит только потому, что viewcontroler1 попросил «общий класс» отправить конкретное сообщение, после чего viewcontroller 2 попросил отправить другое сообщение. Тогда это невозможно поймать с помощью модульных тестов.
  • Подкласс UIViewController, который реализует методы и подкласс моих ViewControllers этого.

    • Одна из проблем заключается в том, что если у меня есть разные виды в приложении, тогда мне нужно создать подкласс для каждого типа ViewController с помощью методов делегирования сеансов NSURL. И я должен тщательно назначить объект делегата от метода к методу. Когда я смотрю на него, я думаю, что этот подход также имеет один и тот же блок-тестирование проблемы, как подход 1.

Я был бы признателен за любые комментарии по 1. Подходы других использовали в аналогичной ситуации 2. Плюсы/минусы вышеуказанных подходов (в том числе 2, перечисленных выше). Я понимаю, что это может быть немного субъективно, но IMHO, получающий хорошие советы по шаблонам проектирования, так же важен, как (или даже более важно) ответы на то, что не так с моим кодом или какой API для решения проблемы X

+1

«Создайте класс, соответствующий протоколу делегата NSURLSession». Сделайте его одиночным, если только одно соединение может быть активным одновременно и/или если соединение должно продолжаться после уничтожения контроллера просмотра. В противном случае каждый контроллер представления может использовать отдельный экземпляр класса. – Gruntcakes

+0

Спасибо, так как пользователь может отправить файл, а затем либо a) положить приложение в фоновом режиме, либо b) перейти на другой экран в приложении, я думал, что лучше всего использовать одноэлементный подход. Но я видел, как некоторые страшные вещи о синглтоне были плохими. IMHO, проблемы с тестируемостью, которые кажутся применимыми к другим подходам. Итак, я думаю, что могу просто пойти с этим. –

ответ

1

как я делал это в прошлом:

1) Создан класс, который содержал NSURLSession объекта @interface CustomSession: NSURLSessionDelegate @property (неатомический, сильный) NSURLSession * mySession;

2) В методе инициализации mySession методом CustomSession установите делегат на себя.

3) Реализованы необходимые методы делегатов NSURLSession в CustomSession.

4) Использование методов блок (не обязательно, но я предпочитаю их)

5) Решите, хотите ли вы использовать CustomSession как одноточечного или экземпляр его каждый раз, когда вам это нужно. Фактически вы можете просто определить методы init соответственно.

+ (CustomSession *)session 
{ 
    //Singleton 
} 

+ (instancetype) newClient{ 
    //normal init method} 

6) Как для модульного тестирования, вы могли бы иметь слабый указатель в CustomSession к родителю VC (как вы отметили, это будет работать, если вы не используете Singleton).

Быстрое предложение: Используйте AFNetworking, упростите свою жизнь. Например, я использую AFHTTPSessionManager и соответствующие методы блоков: [self GET: detailsURL parameters: параметры success:^(NSURLSessionDataTask * task, id responseObject)

+0

Спасибо @codinpora. Поскольку пользователь может отправить/запросить файл и a) положить приложение в фоновом режиме или b) перейти на другой экран в приложении, мне не нужен подход с одноэлементным доступом. Видите ли вы ее вокруг? Я думал о AFNetworking, но также хотел узнать SDK о «жестком пути» в случае наличия гибких возможностей, которые AFNetworking не раскрывает. С AFNetworking я вижу, что вам нужно всего лишь предоставить блоки для выполнения «успеха» или «сбоя», как они обрабатывают такие вещи, как перемещение пользователей с одного экрана на другой? Будет ли у него лучше быть в состоянии писать лучший код с проверкой на работоспособность? –