Правильный способ опроса веб-службы в приложении для iPhone - PullRequest
5 голосов
/ 04 апреля 2011

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

Кажется, что я мог бы поместить весь код для вызова веб-службы и проанализировать xml в NSOperation и добавить эту NSOperation в NSOperationQueue, сохраненную в делегате приложения, как только приложение запустится.

Правильно ли использовать NSTimer внутри основного метода NSOperation, чтобы операция повторялась один раз в минуту, до бесконечности? В этом сценарии операция NSO никогда не вернется - это то, чего я хочу, но я не уверен, что это правильный способ думать об этом.

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

Ответы [ 4 ]

0 голосов
/ 09 апреля 2011

Я бы не использовал NSTimer для этой проблемы / дизайна. Я бы создал NSThread из AppDelegate при запуске приложения. Я бы понизил приоритет этой темы. Внутри основного метода NSThread есть цикл.

-(void)main {

    while(true) {
        // get raw data from url
        // hash the result
        // compare the hash to the last time
        if (currentHash != lastHash) {
          // post a notification to default center with the new data
          lastHash = currentHash;
        }
        // sleep the thread sleepForTimeInterval
    }
}

Ваш объект Model подпишется на уведомление от потока и проанализирует новые данные и обновит ivars. Ваш объект View будет прослушивать модель с использованием KVO и отображать любые обновления / изменения.

0 голосов
/ 05 апреля 2011

Я настоятельно рекомендую вам взглянуть на ASIHTTPRequest .Какой удивительный маленький класс, и действительно хорошо документированный.

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

Взгляните на этот ответ для того, что кажется оптимальным решением.

0 голосов
/ 09 апреля 2011

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

таким образом, обеспечивает больший контроль над паузой / возобновлением / задержками / синхронизацией, и вы можете легкоконтролировать количество активных запросов (должно быть ровно ноль или один).

0 голосов
/ 04 апреля 2011

Настоящий правильный способ сделать это - использовать push-уведомления . Если у кого-либо из ваших пользователей есть тарифные планы с ограниченными данными или данные, взимаемые в зависимости от использования, они будут вам благодарны.

Но если вы настаиваете на опросе, вы также можете использовать NSTimer напрямую, а не связываться с таймером внутри NSOperation. Это будет выполняться в главном потоке, но вы можете использовать функцию обратного вызова таймера performSelectorInBackground:withObject: для обработки в фоновом режиме. Или вы можете просто пропустить таймер и запустить всю последовательность опроса на отдельном NSThread и использовать sleepForTimeInterval: для задержки между опросами.

...