NSURLConnection устарела в iOS9

Я хочу скачать файл с NSURLRequest и сохранить его, но в соответствии с

NSData * data = ... случается ошибка.

NSURL *Urlstring = [NSURL URLWithString:@"http://yourdomain.com/yourfile.pdf"];
NSURLRequest *request = [NSURLRequest requestWithURL: Urlstring];
NSData *data = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];

NSURL *documentsURL = [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject];
documentsURL = [documentsURL URLByAppendingPathComponent:@"localFile.pdf"];

[data writeToURL:documentsURL atomically:YES];

Предупреждающее сообщение о том, что я должен использовать NSURLSession dataTaskwithrequest"так как sendSynchronousRequest устарела в iOS 9, но это не работает, я надеюсь, что кто-то может мне помочь

1 ответ

Решение

Теперь вы должны использовать NSURLSession

Пример (GET):

-(void)placeGetRequest:(NSString *)action withHandler:(void (^)(NSData *data, NSURLResponse *response, NSError *error))ourBlock {

    NSString *urlString = [NSString stringWithFormat:@"%@/%@", URL_API, action];


    NSURL *url = [NSURL URLWithString:urlString];
    NSURLRequest *request = [NSURLRequest requestWithURL:url];

    [[[NSURLSession sharedSession] dataTaskWithRequest:request completionHandler:ourBlock] resume];
}

Теперь вам нужно будет вызвать этот метод с действием (или вашим полным URL-адресом, если вы предпочитаете) и блоком, который будет выполнен при возврате вызова API.

[self placeGetRequest:@"action" withHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
    // your code
}];

Внутри этого блока вы получите NSData с данными ответа и NSURLResponse с ответом HTTP. Итак, теперь вы можете поместить свой код там:

NSURL *documentsURL = [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject];
documentsURL = [documentsURL URLByAppendingPathComponent:@"localFile.pdf"];

[data writeToURL:documentsURL atomically:YES];

Основное различие между NSURLSession и NSURLConnection

  • NSURLConnection: если у нас есть открытое соединение с NSURLConnection и система прерывает наше приложение, когда наше приложение переходит в фоновый режим, все, что мы получили или отправили, были потеряны. Диаграмма процесса для NSURLConnection

  • NSURLSession: решить эту проблему, а также дать нам вне процесса загрузки. Он управляет процессом подключения, даже когда у нас нет доступа. Вам нужно будет использовать application:handleEventsForBackgroundURLSession:completionHandler в вашем AppDelegate Диаграмма процесса для NSURLS сессия

Таким образом, с использованием NSURLSession вам не нужно управлять или проверять ваше интернет-соединение, потому что ОС делает это за вас.

Другие вопросы по тегам