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

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

Ответ 1

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

BTW. Если вам нужно продолжить загрузку, даже когда ваше приложение выйдет, вы можете установить свойство ShouldContinueWhenAppEntersBackground вашего запроса в YES.

Ответ 2

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

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

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