Фоновая загрузка приложения iOS

Привет! Мне нужно знать, как я могу заставить свое приложение iOS начать загрузку в фоновом режиме приложения (например, запустить загрузку в файле AppDelegate), чтобы изменение ViewController не прерывало или не отменяло загрузку. Мне также нужно иметь возможность получить ход загрузки (0.00000 - 1.00000), чтобы установить объект UIProgressView, что также означает, что мне нужна функция - (void)progressDidChangeTo:(int)progress.


person Hank Brekke    schedule 02.01.2011    source источник


Ответы (2)


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

Я бы не стал загружать что-либо напрямую в AppDelegate. Вместо этого я бы создал отдельный класс только для этой цели. Назовем его MyService. Затем я инициализирую этот класс в своем делегате приложения.

Класс может работать как синглтон или может быть передан каждому контроллеру представления, которому он требуется.

В класс MyService я бы добавил ASINetworkQueue и несколько методов для обработки запросов, когда они будут готовы. Вот код из примеров ASI, который вы можете использовать:

- (IBAction)startBackgroundDownloading:(id)sender
{
   if (!self.queue) {
      self.queue = [[[ASINetworkQueue alloc] init] autorelease];
   }

   NSURL *url = [NSURL URLWithString:@"http://allseeing-i.com"];
   ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
   [request setDelegate:self];
   [request setDidFinishSelector:@selector(requestDone:)];
   [request setDidFailSelector:@selector(requestWentWrong:)];
   [self.queue addOperation:request]; //queue is an NSOperationQueue
   [self.queue go];
}

- (void)requestDone:(ASIHTTPRequest *)request
{
   NSString *response = [request responseString];
   //Do something useful with the content of that request.
}

- (void)requestWentWrong:(ASIHTTPRequest *)request
{
   NSError *error = [request error];
}

Если вам нужно установить индикатор выполнения. Я бы просто выставил setDownloadProgressDelegate из ASINetworkQueue в своем классе MyService и установил его в своих ViewControllers следующим образом:

[[MyService service] setDownloadProgressDelegate: self.myUIProgressView];

КСТАТИ. Если вам нужно продолжить загрузку, даже когда ваше приложение закрывается, вы можете установить для свойства ShouldContinueWhenAppEntersBackground вашего запроса значение YES.

person Piotr Czapla    schedule 02.01.2011
comment
... Я. Мне нужно, чтобы загрузка происходила в файле AppDelegate, чтобы загрузка не останавливалась при запуске UIViewController, который ее инициировал. Мне нужно знать, как я могу заставить UIViewController запускать и получать доступ к объекту ASIHTTPRequest, но держать объект в AppDelegate. - person Hank Brekke; 02.01.2011
comment
Проблема в том, что reportFailure будет вызываться в ASIHTTPRequest.m каждый раз, когда мое приложение возвращается из фона. Я использую так же, как вы предложили в своем посте, и для параметра ShouldContineWhenAppEntersBackground установлено значение YES. - person Bagusflyer; 17.10.2012

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

NSURLRequest *urlRequest = [[NSURLRequest alloc] initWithURL:url];
connection = [[NSURLConnection alloc] initWithRequest:urlRequest delegate:self];
[urlRequest release];

чтобы иметь свой прогресс, вы можете использовать:

connection:didReceiveResponse:(NSURLResponse *)response;

делегировать вызов для проверки response.expectedContentLength, а затем использовать

connection:didReceiveData:(NSData *)data

для отслеживания объема загруженных данных и расчета процента.

Надеюсь, это поможет, Мози

person Moszi    schedule 02.01.2011
comment
У меня есть часть загрузки, используя ASIHTTPRequest, мне просто нужно знать, как реализовать загрузку, чтобы она начиналась в фоновом режиме, а не в текущем открытом UIViewController, поэтому, когда контроллер представления закрывается, загрузка продолжается. - person Hank Brekke; 02.01.2011
comment
Вы можете создать одноэлементный класс для управления вашей загрузкой, таким образом, этот класс будет существовать, даже если ваш контроллер представления освобожден. (одиночный шаблон в Википедии: en.wikipedia.org/wiki/Singleton_pattern) - person Moszi; 02.01.2011