大家好,提前感谢您为理解如何将一些 NSURLConnection 代码转换为较新的 NSURLSession 提供的帮助。
我想做的是向服务器发出 POST 请求,并发送为键“照片”编码的照片 Base 64。
下面我有一个用 NSURLConnection 编写的工作示例,我想将其转换为 NSURLSession。
正如我根据我的理解阅读苹果文档时,我应该使用数据任务,因为在我的情况下它是图像,如果它是像视频这样的较大传输,我应该使用上传任务。
关于上传任务我找到了下一个tutorial但问题是,就我而言,我还设置了标题,而且我的内容类型应该是多部分/表单数据。
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"];
}
}];
我想提一下,我尝试使用 Raywenderlich 教程构建一个工作示例,但我在设置标题的方式上遇到了错误
预先感谢您提供的任何帮助!
我正在使用我编写的一个简单的 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);
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)