2011-01-02 2 views
7

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

ответ

18

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

Я бы не загрузил ничего в 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.

+0

... Я. Мне нужно, чтобы загрузка выполнялась в файле AppDelegate, так что загрузка не прекратится, когда начнется запуск UIViewController. Мне нужно знать, как я могу получить UIViewController для запуска и доступа к объекту ASIHTTPRequest, но объект должен находиться в AppDelegate. –

+0

@hankweb, я только что обновил свой ответ. –

+0

Проблема заключается в том, что reportFailure будет вызываться в ASIHTTPRequest.m каждый раз, когда мое приложение возвращается с фона. Я использую то же самое, что вы предлагали в своем посте, а значение параметра ShouldContineWhenAppEntersBackground - YES. –

3

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

+0

У меня есть часть загрузки вниз, используя ASIHTTPRequest, мне просто нужно знать, как реализовать загрузку для запуска в фоновом режиме, а не текущий открытый UIViewController, поэтому, когда контроллер просмотра отклонен, загрузка продолжается. –

+0

Вы можете создать одноэлементный класс для управления загрузкой, таким образом этот класс будет вокруг, даже если ваш контроллер просмотра будет удален. (singleton pattern on wikipedia: http://en.wikipedia.org/wiki/Singleton_pattern) – Moszi

Смежные вопросы