Objective C 语言 使用NSURLSession处理网络请求

Objective-C阿木 发布于 2025-06-29 11 次阅读


Objective-C中使用NSURLSession处理网络请求

随着移动应用的日益普及,网络请求处理成为了开发者必须掌握的核心技能之一。Objective-C作为iOS开发的主要语言,其网络请求处理方式也经历了从传统的NSURLConnection到NSURLSession的演变。本文将围绕Objective-C中使用NSURLSession处理网络请求这一主题,从基础知识到高级技巧,为您详细解析NSURLSession的使用方法。

一、NSURLSession简介

NSURLSession是iOS 7及以上版本引入的一个全新的网络请求框架,它提供了更加灵活和强大的网络请求处理能力。与NSURLConnection相比,NSURLSession具有以下优点:

1. 支持多个网络请求的并发处理。

2. 支持断点续传功能。

3. 支持上传和下载任务的管理。

4. 支持网络请求的取消和暂停。

二、NSURLSession的基本使用

1. 创建NSURLSession对象

我们需要创建一个NSURLSession对象,它是所有网络请求的基础。可以通过以下代码创建一个默认的NSURLSession:

objective-c

NSURLSession session = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration] delegate:nil delegateQueue:[NSOperationQueue mainQueue]];


2. 创建NSURLSessionDataTask

NSURLSessionDataTask用于处理GET和POST请求。以下代码展示了如何创建一个NSURLSessionDataTask:

objective-c

NSString urlString = @"http://www.example.com/data";


NSURL url = [NSURL URLWithString:urlString];


NSURLSessionDataTask task = [session dataTaskWithRequest:[NSURLRequest requestWithURL:url] completionHandler:^(NSData data, NSURLResponse response, NSError error) {


if (error) {


NSLog(@"Error: %@", error.localizedDescription);


} else {


NSLog(@"Data: %@", [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]);


}


}];


3. 启动任务

创建好NSURLSessionDataTask后,我们需要调用`resume`方法来启动任务:

objective-c

;


4. 取消任务

如果需要取消任务,可以使用`cancel`方法:

objective-c

;


三、NSURLSession的上传和下载

NSURLSession不仅支持GET和POST请求,还支持上传和下载任务。以下是如何使用NSURLSession进行上传和下载的示例:

1. 上传文件

objective-c

NSMutableURLRequest request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:@"http://www.example.com/upload"]];


[request setHTTPMethod:@"POST"];


[request setValue:@"multipart/form-data" forHTTPHeaderField:@"Content-Type"];

NSData fileData = [NSData dataWithContentsOfFile:@"path/to/file"];


[request setHTTPBody:fileData];

NSURLSessionUploadTask uploadTask = [session uploadTaskWithRequest:request fromData:fileData completionHandler:^(NSData data, NSURLResponse response, NSError error) {


if (error) {


NSLog(@"Error: %@", error.localizedDescription);


} else {


NSLog(@"Upload success!");


}


}];


[uploadTask resume];


2. 下载文件

objective-c

NSString urlString = @"http://www.example.com/file.zip";


NSURL url = [NSURL URLWithString:urlString];


NSURLSessionDownloadTask downloadTask = [session downloadTaskWithRequest:[NSURLRequest requestWithURL:url] completionHandler:^(NSURL location, NSURLResponse response, NSError error) {


if (error) {


NSLog(@"Error: %@", error.localizedDescription);


} else {


NSLog(@"Download success! File path: %@", [location path]);


}


}];


[downloadTask resume];


四、NSURLSession的高级使用

1. 使用NSURLSessionConfiguration

NSURLSessionConfiguration允许我们自定义网络请求的配置,如代理、缓存策略等。以下是如何创建一个自定义的NSURLSessionConfiguration:

objective-c

NSURLSessionConfiguration config = [NSURLSessionConfiguration defaultSessionConfiguration];


config.delegate = self;


config.delegateQueue = [NSOperationQueue mainQueue];


config.requestCachePolicy = NSURLRequestUseProtocolCachePolicy;


config.timeoutIntervalForRequest = 10.0;


2. 使用NSURLSessionTaskDelegate

NSURLSessionTaskDelegate提供了任务完成、错误处理、上传进度和下载进度等回调方法。以下是如何实现NSURLSessionTaskDelegate:

objective-c

@interface MySessionDelegate : NSObject <NSURLSessionTaskDelegate>


@end

@implementation MySessionDelegate

- (void)URLSession:(NSURLSession )session task:(NSURLSessionTask )task didSendBodyData:(int64_t)bytesSent totalBytesSent:(int64_t)totalBytesSent totalBytesExpectedToSend:(int64_t)totalBytesExpectedToSend {


NSLog(@"Upload progress: %f%%", (float)totalBytesSent / totalBytesExpectedToSend 100);


}

- (void)URLSession:(NSURLSession )session task:(NSURLSessionTask )task didReceiveResponse:(NSURLResponse )response completionHandler:(void (^)(NSURLSessionResponseDisposition))completionHandler {


completionHandler(NSURLSessionResponseAllow);


}

- (void)URLSession:(NSURLSession )session task:(NSURLSessionTask )task didCompleteWithError:(NSError )error {


if (error) {


NSLog(@"Error: %@", error.localizedDescription);


} else {


NSLog(@"Task completed successfully!");


}


}

@end

// 使用自定义的NSURLSessionConfiguration和Delegate


NSURLSession session = [NSURLSession sessionWithConfiguration:config delegate:self delegateQueue:[NSOperationQueue mainQueue]];


五、总结

本文详细介绍了Objective-C中使用NSURLSession处理网络请求的方法,包括基础知识、基本使用、上传和下载以及高级使用。通过学习本文,开发者可以更好地掌握NSURLSession的使用技巧,提高移动应用的网络请求处理能力。