Подтвердить что ты не робот

Лучшая практика для отправки большого количества данных в фоновом режиме на устройстве iOS4?

У меня есть приложение, которому необходимо отправить данные (используя POST) на сервер. Эта функция должна находиться на одном из субконтроллеров NavigationController, и пользователь должен уметь отходить от этого контроллера и/или закрывать приложение (поддерживается только iPhone4/iOS4). Должен ли я использовать потоки /NSOperations или/и отправлять данные с использованием существующих асинхронных методов? Любые идеи/рекомендации, как это реализовать?

4b9b3361

Ответ 1

Хорошо, я отвечу на свой вопрос. Во-первых, как сказал tc, лучше иметь этот вызов у ​​делегата приложения, чтобы View в NavigationController мог быть закрыт. Во-вторых, отметьте начало обработки фона с помощью beginBackgroundTaskWithExpirationHandler: и завершите его с помощью endBackgroundTask: следующим образом:

.h:

UIBackgroundTaskIdentifier bgTask;

.m:

- (void)sendPhoto:(UIImage *)image
{
  UIApplication *app = [UIApplication sharedApplication];

  bgTask = [app beginBackgroundTaskWithExpirationHandler:^{ 
    [app endBackgroundTask:bgTask]; 
    bgTask = UIBackgroundTaskInvalid;
  }];


  NSLog(@"Sending picture...");

  // Init async NSURLConnection

  // ....
}

- (void)connectionDidFinishLoading:(NSURLConnection *)connection {

  NSLog(@"Picture sent.");

  UIApplication *app = [UIApplication sharedApplication];

  if (bgTask != UIBackgroundTaskInvalid) {
    [app endBackgroundTask:bgTask]; 
    bgTask = UIBackgroundTaskInvalid;
  }
}

У вас есть 10 минут, прежде чем iOS прекратит ваше приложение. Вы можете проверить это время с помощью [app backgroundTimeRemaining]

Ответ 2

Я просто использую NSURLConnection. Это немного сложно, если вы хотите отправить multipart/form-data (см. Пример SimpleURLConnections/PostController.m). Я бы вложил его в делегат приложения, но мне это лениво.

Вы не должны беспокоиться о потоках вообще, если неблокирующий ввод-вывод (т.е. NSURLConnection) слишком медленный. Threading имеет свои собственные накладные расходы, а межпоточная связь - это боль, а взаимоблокировки ужасны.

Что вам нужно сделать, так это запустить фоновое задание, позволяющее вашему приложению продолжить выполнение в фоновом режиме (завершение фоновой задачи в connectionDidFinishLoading: и connection: didFailWithError). Для завершения выполнения фоновых задач для заданных приложений требуется около 10 минут.

Ответ 3

Используйте ASIHTTP и настройте очередь. Вся необходимая информация находится здесь:

http://allseeing-i.com/ASIHTTPRequest/

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

Он используется тоннами отличных приложений для iPhone.

Ответ 4

Я бы предложил второй поток для любого длительного процесса, который должен выполняться, пока пользователь делает что-то еще.

Еще одна вещь, о которой вам нужно подумать, - это то, что произойдет, если пользователь запустит процесс, а затем ударит кнопку дома. Как взаимодействие сервера может быть прервано? Может ли он продолжаться, когда пользователь входит в приложение? и др.

Ответ 5

Я хотел бы поддержать сообщение, которое упоминает:

bgTask = [app beginBackgroundTaskWithExpirationHandler:^{ 
      [app endBackgroundTask:bgTask]; 

      bgTask = UIBackgroundTaskInvalid;
}];

Но также укажите, что вы можете также инкапсулировать свою единицу работы в подкласс NSOperation. Это сделает его чрезвычайно пригодным для повторного использования и, в сочетании с NSOperationQueue, автоматически обрабатывает потоки, а что нет. Затем, когда вы захотите изменить свой код или появиться в другом месте вашего приложения, будет тривиально перемещаться или редактировать.

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

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