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

StackOverflow https://stackoverflow.com/questions/3928861

Вопрос

У меня есть приложение, которое необходимо отправлять данные (с использованием post) на сервер. Эта функция должна выполняться на одном из субконтроллеров NavigationController, и пользователь должен иметь возможность выходить из этого контроллера и/или закрыть приложение (будет поддерживаться только iPhone4/IOS4). Должен ли я использовать потоки/nsoperations или/и отправлять данные, используя существующие асинхронные методы? Есть идеи/лучшие практики, как это реализовать?

Это было полезно?

Решение

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

.час:

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]

Другие советы

Я бы просто использовал NSURLConnection. Это немного сложно, если вы хотите отправить Multipart/Form-Data (см. Пример SimpleUrlConnections/postcontroller.m). Я бы вставил это в приложение делегат, но я так ленив.

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

Что ты делать Необходимо запустить фоновую задачу, чтобы позволить вашему приложению продолжить выполнение при фоновом режиме (завершить фоновую задачу в соединении. Фоновые приложения дают около 10 минут для завершения выполнения фоновых задач.

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

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

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

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

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

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

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

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

      bgTask = UIBackgroundTaskInvalid;
}];

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top