У меня есть приложение, которому необходимо отправить данные (используя POST) на сервер. Эта функция должна находиться на одном из субконтроллеров NavigationController, и пользователь должен уметь отходить от этого контроллера и/или закрывать приложение (поддерживается только iPhone4/iOS4). Должен ли я использовать потоки /NSOperations или/и отправлять данные с использованием существующих асинхронных методов? Любые идеи/рекомендации, как это реализовать?
Лучшая практика для отправки большого количества данных в фоновом режиме на устройстве iOS4?
Ответ 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/