iphone RESTful веб-сервисы - PullRequest
       17

iphone RESTful веб-сервисы

3 голосов
/ 21 сентября 2009

Даже не уверен, что заголовок правильный, но я пытаюсь использовать стандартный класс NSURLConnection для обработки ответов от вызова моего веб-сервиса. Я использую метод POST для обновления базы данных и метод GET для извлечения строк из базы данных. У меня проблема в том, что эти 2 действия могут происходить одновременно, так что методы для обработки запроса могут наступать друг на друга. Другими словами, в моем методе «connection didReceiveData» у меня есть 2 пути через код в зависимости от того, обрабатываю ли я ответ от запроса GET или POST.

Я отслеживаю, какой запрос обрабатывается переменной экземпляра requestType. Проблема в том, что, поскольку запросы выполняются одновременно, переменная экземпляра изменяется с GET на POST до завершения GET (или наоборот). У меня вопрос, как мне поддерживать 2 отдельных запроса в этом сценарии? Я синхронизирую запросы? Есть ли способ для потоков работать здесь? Я создаю 2 отдельных объекта для каждого из запросов и имею логику в запросе "didRecieveData", для которого объект обрабатывается? Любая помощь будет высоко ценится!

Ответы [ 3 ]

1 голос
/ 21 сентября 2009

Решите похожую проблему в одном из наших приложений. Решение заключалось в создании класса, представляющего вызов веб-службы, отвечающего за вызов своего собственного URL-адреса, загрузку собственных данных и т. Д. У класса вызова был делегат, который будет обрабатывать анализ ответов (в нашем случае, контроллер веб-службы). В итоге получилось довольно сложно, но помешало проблеме NSURLConnections наступать друг на друга.

1 голос
/ 21 сентября 2009

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

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

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

3) Напишите ваши классы обработки соединений, чтобы они использовали синхронный метод NSURLConnection, и вызовите этот класс в фоновом потоке.

В любом случае, чистый код и четкая ориентация объекта предотвратят беспорядочные сценарии, подобные описываемому вами.

0 голосов
/ 21 сентября 2009

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

Хороший пример здесь:

http://www.cimgf.com/2008/02/16/cocoa-tutorial-nsoperation-and-nsoperationqueue/

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

...