Привет! Мне нужно знать, как я могу заставить свое приложение iOS начать загрузку в фоновом режиме приложения (например, запустить загрузку в файле AppDelegate), чтобы изменение ViewController не прерывало или не отменяло загрузку. Мне также нужно иметь возможность получить ход загрузки (0.00000 - 1.00000
), чтобы установить объект UIProgressView
, что также означает, что мне нужна функция - (void)progressDidChangeTo:(int)progress
.
Фоновая загрузка приложения iOS
Ответы (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.
вы можете использовать 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
для отслеживания объема загруженных данных и расчета процента.
Надеюсь, это поможет, Мози