Фоновая загрузка приложений iOS - PullRequest
8 голосов
/ 02 января 2011

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

Ответы [ 2 ]

18 голосов
/ 02 января 2011

Просто используйте 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.

3 голосов
/ 02 января 2011

вы можете использовать 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

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

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

...