Должен ли я использовать синглтон - Http-соединение с сервером - Iphone App дизайн - PullRequest
1 голос
/ 12 декабря 2010

Итак, я читал о плюсах и минусах использования Singleton, и у меня есть сценарий, в котором я не уверен, стоит ли его использовать, и я подумал проконсультироваться с вами, ребята.

I 'я пишу приложение для Iphone, которое время от времени должно сообщать серверу (HTTP) информацию о пользователе, вошедшем в систему. Этот веб-сервис вызывается из разных частей моего приложения.

Что мне действительно нужно, так это2 типа классов:

  1. Ответственный за связь с сервером - отвечает за настройку http, URL, заголовок, параметры и т. Д.

2.классы для каждого типаAPI веб-службы - например, UpdateUserInfo или класс SendResults.Этот c

2-й класс будет использовать 1-й, и на протяжении всего приложения мне понадобится много вызовов для 2-х классов.

Должен ли я использовать Singleton для любого из тезисов?Каков наилучший способ его разработки?

Спасибо, ребята!

Редактировать :

Пример для 1-го класса (назовем его DataDownloader).будет:

(NSData *) downloadDataWithRequest:(NSURLRequest *)
{
    ASIHTTPRequest *dlRequest = [[ASIHTTPRequest alloc] initWithURL:[request URL]];
    [dlRequest setTimeOutSeconds:20];    

    if(retryNum < 1)
        retryNum = 1;
    [dlRequest setNumberOfTimesToRetryOnTimeout:retryNum];

       // and more of the same
}

ASIHTTPRequest - это то, что мы используем в качестве оболочки HTTP.

Теперь я не хочу вызывать эту последовательность функций каждый раз, когда хочу отправить серверHTTP-запрос, поэтому можно было бы поместить его в выделенный класс и создать новый экземпляр или использовать одиночный код.

Например, я могу использовать что-то подобное:

[[UpdateUserInfo sharedInstance] updateInfo:info]

Это можно реализовать, настроив NSURLRequest с использованием информации о параметре и вызвав

[[DataDownloader sharedInstance] downloadDataWithRequest:InfoUrlRequest]

Теперь, предполагая, что http-запрос асинхронный, я все равно могу вызывать несколько одновременно.

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

Ответы [ 5 ]

1 голос
/ 12 декабря 2010

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

Например, есть ли причина, по которой вы не разрешаете пользователю одновременно выполнять две операции, связанные с сетью?

Между прочим, из интереса вы смотрели на классы Какао, такие как NSURLConnection ? Я не уверен, что вам понадобится класс более низкого уровня для управления взаимодействием с сервером, как вы и предполагали - этого класса может быть достаточно. (Пришлось рассказать, не зная больше о том, чего ты пытаешься достичь.)

0 голосов
/ 13 декабря 2010

Я бы использовал шаблон Service Locator для получения каждой из услуг, необходимых в вашем приложении. Есть несколько разных способов создания сервисного локатора. Я предпочитаю настройку при инициализации, а не настройку во время выполнения.

http://en.wikipedia.org/wiki/Service_locator_pattern

0 голосов
/ 12 декабря 2010

Я использую шаблон синглтона для управления доступом к веб-API, который использует ASIHTTPRequest, и он работает очень хорошо. ASI использует NSOperationQueues для асинхронных запросов, поэтому вам не нужно беспокоиться о том, что запросы забивают друг друга.

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

0 голосов
/ 12 декабря 2010

У меня обычно (и это личное предпочтение) есть один синглтон, который управляет сетевым управлением (шаблон синглтона и фасада в одном), чтобы не было более 5 разрешенных соединений.Может быть возможно и для вас.Это было бы единственной частью вашей задачи 1.
Но, как уже указывал BobC, ASIHTTPRequest должен делать все, что вам нужно.
Не изобретайте велосипед!

0 голосов
/ 12 декабря 2010

Также не забудьте про ASIHTTPRequest.Это полнофункциональная сетевая библиотека

http://allseeing -i.com / ASIHTTPRequest /

...