Преобразование NSURLConnection в nsurlsessionuploadtask пример
Привет всем и заранее спасибо за любую помощь в понимании того, как преобразовать некоторый код NSURLConnection в более новый NSURLSession. То, что я пытаюсь сделать, - это сделать запрос POST на сервер и отправить базу фотографий 64, закодированную для ключа "фото".
Ниже у меня есть рабочий пример, написанный в NSURLConnection, и я хотел бы преобразовать его в NSURLSession.
Как я прочитал в документации apple из того, что я понял, я должен использовать задачи данных, потому что в в моем случае это изображение,и если это большая передача, как видео, я должен использовать задачи загрузки.
Что касается задачи загрузки, я нашел следующий учебник , но проблема в том, что в моем случае я также устанавливаю заголовки, а также мой тип контента должен быть multipart/form-data.
NSURL *url = [NSURL URLWithString:myLink];
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:url];
[request setHTTPMethod:@"POST"];
[request addValue:parameter1 forHTTPHeaderField:header1];
[request addValue:parameter2 forHTTPHeaderField:header2];
[request addValue:parameter3 forHTTPHeaderField:header3];
[request addValue:parameter4 forHTTPHeaderField:header4];
[request addValue:parameter5 forHTTPHeaderField:header5];
[request setHTTPBody:[UIImageJPEGRepresentation(avatarImage, 1.0) base64EncodedDataWithOptions:NSDataBase64Encoding64CharacterLineLength]];
[NSURLConnection sendAsynchronousRequest:request
queue:[NSOperationQueue mainQueue]
completionHandler:^(NSURLResponse *response, NSData *data, NSError *error){
NSHTTPURLResponse *httpResp = (NSHTTPURLResponse*) response;
NSError *jsonError;
if(httpResp.statusCode == 200){
NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:data
options:NSJSONReadingAllowFragments
error:&error];
if (!jsonError) {
[[NSUserDefaults standardUserDefaults] setObject:[dict objectForKey:@"photo_url"] forKey:@"avatarLink"];
[[NSUserDefaults standardUserDefaults] synchronize];
}
}
else {
NSString *errorCode = [NSString stringWithFormat:@"An error has occured while uploading the avatar: %ld", (long)httpResp.statusCode];
[GeneralUse showAlertViewWithMessage:errorCode andTitle:@"Error"];
}
}];
Я хотел бы упомянуть, что я пытался построить рабочий пример, используя учебник Рэя Вендерлиха, но я получил ошибку относительно того, как я устанавливал свои заголовки
Спасибо, Ин заранее за любую оказанную помощь!
1 ответ:
Я использую простой класс HTTPClient, который я написал, но, к сожалению, в настоящее время он не поддерживает задачи загрузки. Но ниже я предлагаю метод для создания такой задачи загрузки. Мой клиент поддерживает ссылку на NSURLSession и словарь запущенных задач (ключ-сама задача, значение-полученная NSData) как способ асинхронной обработки приема данных ответа для (возможно, более чем одной) сессионной задачи. Для работы мой клиент реализует следующие протоколы:. Я бы создайте задачу загрузки следующим образом:
- (NSURLSessionTask *) startUploadTaskForURL: (NSURL *) url withData: (NSData *) data { NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url]; [request setHTTPMethod:@"POST"]; [request addValue:@"multipart/form-data" forHTTPHeaderField:@"Content-Type"]; NSURLSessionUploadTask uploadTask = [self.session uploadTaskWithRequest:request fromData:data]; [self scheduleTask:task]; return task; } - (void) scheduleTask: (NSURLSessionTask *) task { [self.runningTasks setObject:[NSMutableData data] forKey:task]; [task resume]; } - (NSMutableData *) dataForTask: (NSURLSessionTask *) task { return [self.runningTasks objectForKey:task]; } - (void) URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveData:(NSData *)data { NSString *dataString = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; NSLog(@"HTTPClient: Data task received data: %@", dataString); NSMutableData *runningData = [self dataForTask:dataTask]; if (!runningData) { NSLog(@"No data found for task"); } [runningData appendData: data]; } - (void) URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error { NSLog(@"HTTPClient: Task completed with error: %@", error); // my client also works with a delegate, so as to make it reusable [self.delegate sessionTask:task completedWithError:error data:[self dataForTask:task]]; } - (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didSendBodyData:(int64_t)bytesSent totalBytesSent:(int64_t)totalBytesSent totalBytesExpectedToSend:(int64_t)totalBytesExpectedToSend { NSLog(@"HTTPClient: did send body data: %lld of %lld bytes ", totalBytesSent, totalBytesExpectedToSend); }