Продолжить загрузку в фоновом режиме

Я создаю приложение, в котором я загружаю некоторые данные с сервера. В фоновом режиме я хочу, чтобы соединение продолжало работать, чтобы можно было загружать данные. Я знаю, что в appDelegate есть метод

- (void)applicationDidEnterBackground:(UIApplication *)application  

который вызывается, когда приложение переходит в фоновый режим. Но поскольку соединение создается в viewController, как им можно управлять в appDelegate?
Существуют ли другие способы сделать это? Я прошел по этой ссылке, но есть ли что-то просто реализовать?


person Nitish    schedule 19.06.2012    source источник
comment
это официальный способ сделать это, других способов, насколько я знаю, нет   -  person Omar Abdelhafith    schedule 19.06.2012
comment
вам следует проверить эту ссылку stackoverflow.com/questions/4579810/   -  person swiftBoy    schedule 28.06.2012


Ответы (3)


Один из способов выполнить некоторые операции, продолжающиеся в фоновом режиме, — создать отдельный поток для выполнения загрузки. Внутри потока разместите операции загрузки между вызовами beginBackgroundTaskWithExpirationHandler: и endBackgroundTask. Вам не нужно проверять, работаете ли вы в фоновом режиме или нет, вы просто всегда вызываете эти два метода.

// Tell iOS this as a background task in case we get backgrounded
UIBackgroundTaskIdentifier taskId = [[UIApplication sharedApplication] 
          beginBackgroundTaskWithExpirationHandler:NULL];

//----------------------------------------------
// Perform your download operations here
//----------------------------------------------
ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];

// Tell iOS that we are done with stuff that needed to keep going even if backgrounded    
[[UIApplication sharedApplication] endBackgroundTask:taskId];
person progrmr    schedule 27.06.2012
comment
Вы можете установить свойство ASIHttpRequest: [запрос setShouldContinueWhenAppEntersBackground: YES]; - person HelloWorld; 08.12.2012
comment
Большое спасибо!!! Пожалуйста, поправьте меня, если я ошибаюсь: В заключение, почти нет разницы между запуском задачи в фоновом или переднем плане. Оба будут выполняться с этим кодом. Тем не менее, на ум приходят два отличия: 1. если ваша фоновая задача слишком длинная, то, возможно, вас уволят до того, как вы закончите ее! 2. Лучше endBackgroundTask:taskId, чтобы сэкономить лишний заряд батареи. - person Honey; 19.07.2017

[править] Извините, я был неправ, как было указано в комментариях, вы можете увеличить срок, который вам нужно выполнить один раз/до того, как ваше приложение перейдет в фоновый режим. Вот Официальная документация Apple

person bennythemink    schedule 19.06.2012
comment
Это неправда, вы можете выполнить Задание конечной продолжительности в фоновом режиме максимум на 10 минут. - person rckoenes; 19.06.2012
comment
@rckoenes, вы действительно правы, приношу свои извинения. Я отредактирую свой ответ. Спасибо за информацию :) - person bennythemink; 19.06.2012
comment
Все еще неверно, вы можете позвонить beginBackgroundTaskWithExpirationHandler: перед выполнением задачи конечной длины. Вам не нужно выполнять операции, когда вы работаете в фоновом режиме. Вы можете запустить задачу до того, как ваше приложение перейдет в фоновый режим. - person rckoenes; 19.06.2012

Я не знаю, как именно вы справляетесь с загрузкой данных. Но вы можете взглянуть на ASIHTTPRequest. Это очень просто и понятно, и работает с ARC, если вы установите флаги компилятора в -fno-objc-arc. При этом вам нужно только использовать

ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
[request setShouldContinueWhenAppEntersBackground:YES]; //For iOS 4.0 and up 

И это работает.

Здесь вы можете увидеть, как работает ASIHTTPRequest

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

person Thermometer    schedule 26.06.2012
comment
ASIHTTPRequest больше не разрабатывается активно... согласно сообщению здесь. Просто говорю. - person zero0cool; 28.06.2012
comment
Правда, но он все еще работает как шарм. Я не нашел хороших альтернатив с такой функциональностью, как ASIHTTPRequest. - person Thermometer; 29.06.2012