Как возобновить загрузку данных в других представлениях?

Я использую AFNetworking для загрузки файла в формате mp3. Загрузка происходит в конкретном ViewController. Поскольку mp3-файл довольно большой, загрузка занимает несколько минут. Проблема в том, что когда я перехожу к другому ViewController, загрузка останавливается, и я должен оставаться на загрузке ViewController и ждать завершения загрузки. Это было бы неприятно для пользователя! Есть ли способ продолжить загрузку, даже если ViewController отключен? Вот код, который я использую для загрузки:

NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://www.sample.com/samplefile.mp3"]];
AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:request];
NSString *mp3Name = @"sample.mp3";

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *path = [[paths objectAtIndex:0] stringByAppendingPathComponent:mp3Name];
operation.outputStream = [NSOutputStream outputStreamToFileAtPath:path append:NO];

[operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {
    NSLog(@"Successfully downloaded file to %@", path);
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
    NSLog(@"Error: %@", error);
}];

person devdev101    schedule 15.02.2014    source источник


Ответы (2)


Самый простой способ добиться того, чего вы хотите, - это поместить в ApplicationDelegate метод, который запускает загрузку и уведомляет ваши контроллеры представления после завершения загрузки. Так что просто переместите свой код в applicationDelegate.

Обратите внимание: я не думаю, что это лучший способ сделать это, гораздо лучше обрабатывать сетевой трафик в отдельном классе, который для этого принимает, но самый простой способ - использовать (уже установленный) синглтон, который является вашим ApplicationDelegate.

person Blitz    schedule 15.02.2014

Вы можете создать синглтон

 +(id)sharedInstance
{
static dispatch_once_t pred;
static MyClass *sharedInstance = nil;
dispatch_once(&pred, ^{
    sharedInstance = [[MyClass alloc] init];
});
return sharedInstance;
}

И реализуйте в нем свою операцию загрузки.

Если вы раньше не работали с одиночным тоном, вам следует прочитать эту статью Шаблоны проектирования iOS

Также прочтите эту статью о Райвендерлихе. Подскажет, как правильно организовать работу с веб-сервисами.

ускоренный курс AFNetworking

NSOperations

person Roma    schedule 15.02.2014
comment
Спасибо, Рома! Я никогда не работал с синглтоном, так что я отправлюсь к всемогущему райвендерлиху! Обновлю свой ответ, если что-нибудь получу. - person devdev101; 15.02.2014
comment
Кстати, я использую правильный метод загрузки? Обратите внимание, что я хочу загрузить файл (асинхронно) в фоновом режиме, чтобы пользователь мог просматривать приложение во время загрузки файла. - person devdev101; 15.02.2014
comment
Как я вижу из размещенного вами кода - да)) AFNetworking - хорошая библиотека для работы с веб-сервисами. AFNetworking использует NSOperations, которые выполняются в фоновых потоках. - person Roma; 15.02.2014