Отправка нескольких запросов в подклассе NSOperation: синхронизация или асинхронный шаблон? - PullRequest
1 голос
/ 27 марта 2012

Я много искал в 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 class до

sendSynchronousRequest:returningResponse:error:

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

Ответы [ 2 ]

2 голосов
/ 03 апреля 2012

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

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

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

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

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

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

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

1 голос
/ 01 апреля 2012

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

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

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

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

...