Подтвердить что ты не робот

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, но это не работает. Надеюсь, кто-то может мне помочь.

4b9b3361

Ответ 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 Диаграмма процесса для NSURLSession

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