Отправка нескольких запросов в подклассе NSOperation: синхронизация или асинхронный шаблон?

Я много искал в SO, но не могу найти правильный ответ на свой вопрос. Вот проблема:

Я выясняю правильный механизм для отправки нескольких запросов на загрузку в подклассе NSOperation. В частности, этот класс выполняет две разные операции в своем main методе:

  1. Сначала он извлекает данные из локальной базы данных
  2. Затем он отправляет составленные данные на веб-сервер.

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

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

Чтобы выполнить аналогичную загрузку, я использую ASIHttpRequest в режиме синхронизации, как показано ниже.

for (int i = 0; i < numberOfUploads; i++) {

    // 1-grab data here...

    // 2-send data here
    ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
    [request startSynchronous];
    NSError *error = [request error];
    if (!error) {
        int response = [request responseStatusCode];
        if(response == 200)
            uploads++;
    }
}

Итак, мои вопросы:

  1. это действительное решение для загрузки данных на веб-сервер?
  2. допустимо ли создавать ASIHTTPRequest *request в фоновом потоке?
  3. мне нужно использовать асинхронный шаблон? Если да, то как?

Примечание. Я использую ASIHttpRequest для запросов на синхронизацию, но думаю, что тот же шаблон можно применить с классом NSUrlConnection через

sendSynchronousRequest:returningResponse:error:

Заранее спасибо.


person Lorenzo B    schedule 27.03.2012    source источник
comment
Я уже без проблем делаю подобное в своем проекте. NSOperation, который является загружаемым файлом ASIHTTPRequest.   -  person msk    schedule 30.03.2012


Ответы (2)


Чтобы напрямую ответить на ваши вопросы:

  1. Да, вызов NSUrlConnection (в вашем случае - оболочки ASI) с вызовом синхронизации действителен в NSOperation.

  2. Вы можете создавать NSUrlConnections в фоновых потоках, но здесь нужно помнить несколько вещей:

    Если вы используете его в фоновом потоке, вам придется либо вызывать синхронные методы, либо поддерживать поток самостоятельно. Использование async в NSOperation довольно хорошо объясняется здесь: Как мне выполнить асинхронное соединение NSURLConnection внутри NSOperation? Я использовал этот шаблон, и он хорошо работает.

    NSUrlConnnection Обратные вызовы делегатов обращаются к потоку, в котором был создан NSUrlConnection. Просто кое-что запомнить.

  3. Вам не обязательно использовать шаблон async, но вы можете. Асинхронный шаблон обеспечивает большую гибкость. Например, если вам нужно отменить операцию, у вас есть возможность отменить запрос NSUrlConnection с шаблоном async. С шаблоном синхронизации вы вынуждены позволить ему работать (если вы явно не убьете поток).

Одно замечание: я бы пересмотрел вариант использования ASI, поскольку он больше не поддерживается. AFNetworking кажется самой популярной заменой, хотя я решил начать использовать NSUrlConnection напрямую.

person Joseph DeCarlo    schedule 02.04.2012
comment
+1 за вашу поддержку. Спасибо. - person Lorenzo B; 03.04.2012

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

1, это допустимое решение, но вызов только с использованием синхронов 2. вы можете вызвать ASIHTTPRequest в фоновом потоке или вы можете вызвать его, используя

nsurlconnection sendSynchronousRequest:returningResponse:error:
  1. async шаблон не будет работать для фонового потока, вы должны использовать его только в основном потоке.

Надеюсь, поможет .

person Pavan    schedule 01.04.2012