iPhone или Cocoa: порядок обработки нескольких HTTP-запросов - PullRequest
1 голос
/ 13 февраля 2009

При работе с Cocoa / Cocoa-Touch и iPhone SDK типичным соглашением является создание клиента, который взаимодействует с серверным веб-сервером. Одна общая проблема, с которой я сталкиваюсь, когда программирование делает несколько HTTP-запросов последовательно, иногда до 5-6 запросов. Порядок, в котором выполняются запросы, не является линейным, в котором они будут возвращаться. Когда представление переносится в окно, для которого выполняются эти запросы, я получаю уведомления с помощью NSNotification, которые сообщают мне, когда доступны определенные данные. Я обдумываю подход, который запускает мой пользовательский интерфейс только тогда, когда все наборы данных готовы. Нужна хорошая практика и понимание вашего подхода. Вы используете мьютексы или что-то подобное? Простые счетчики?

Ответы [ 3 ]

1 голос
/ 13 февраля 2009

Вам необходимо сохранить некоторое состояние рядом с NSHTTPRequest, чтобы связать ваш запрос с вашим объектом пользовательского интерфейса (или модели), или вы должны быть в состоянии вывести его из содержимого, возвращаемого запросом.

предложения codelogic являются примерами этого паттерна. NSOperation будет другим.

1 голос
/ 13 февраля 2009

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

Другой метод заключается в том, чтобы выполнять HTTP-запросы в другом потоке ( executeSelectorInBackground: или executeSelector: onThread: ), но выполнять их синхронно. Таким образом, вы точно знаете, когда все запросы выполнены, и можете сигнализировать об обновлении пользовательского интерфейса.

0 голосов
/ 19 января 2010

Как уже говорилось в codelogic, поддерживать отдельный массив или словарь довольно просто.

например. убедитесь, что вы правильно инициализируете словарь:

notifications = [[NSMutableDictionary alloc] initWithObjectsAndKeys:
   @"foo", @"bar",
   @"baz", @"bla",
   nil];

И тогда вы можете зарегистрироваться для уведомлений (также в инициализаторе):

for (NSString *key in notifications)
{
  [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(entityDidFetch:) name:key object:self];
}

Метод entityDidFetch: может выглядеть следующим образом:

- (void)entityDidFetch:(NSNotification *)notification
{
 @synchronized(notifications)
 {
  NSString *name = [notification name];
  [notifications removeObjectForKey:name];

  if ([notifications count] == 0)
  {
   // Final connection…
  }
 }
}

И не забудьте выпустить словарь notifications, если вы работаете на iPhone или не используете GC.

...