NSURLConnection 与 NSData + GCD

作者:编程家 分类: objective 时间:2025-08-04

使用 NSURLConnection 和 NSData + GCD 进行网络请求

在 iOS 开发中,我们经常需要通过网络请求获取数据。在早期的 iOS 版本中,我们可以使用 NSURLConnection 类来进行网络请求。而在最新的 iOS 版本中,苹果推荐使用 NSURLSession 来进行网络请求,但是 NSURLConnection 仍然可以使用。

在进行网络请求时,我们通常需要将请求的数据以及请求的地址传递给服务器,并等待服务器的响应。在获取到服务器的响应后,我们需要对数据进行处理,例如解析 JSON 数据或者将数据展示在界面上。

在 iOS 开发中,我们可以使用 NSURLConnection 类来进行网络请求,并使用 NSData 类来处理响应的数据。同时,为了避免阻塞主线程,我们可以使用 GCD (Grand Central Dispatch) 来将耗时的网络请求放在后台线程进行,以保持界面的流畅性。

使用 NSURLConnection 发起网络请求

首先,我们需要创建一个 NSURLConnection 对象,并指定一个 NSURLRequest 对象作为参数来发起网络请求。NSURLRequest 对象包含了请求的地址、请求的方法以及请求的头部信息等。

objective-c

NSURL *url = [NSURL URLWithString:@"https://api.example.com/data"];

NSURLRequest *request = [NSURLRequest requestWithURL:url];

NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:request delegate:self];

在上述代码中,我们创建了一个 NSURL 对象,用于指定请求的地址。然后,我们使用 NSURLRequest 的类方法 requestWithURL: 来创建一个 NSURLRequest 对象,并将 NSURL 对象作为参数传递进去。最后,我们使用 NSURLConnection 的 initWithRequest:delegate: 方法来创建一个 NSURLConnection 对象,并将 NSURLRequest 对象和一个代理对象传递进去。

处理网络请求的响应数据

当服务器返回响应数据时,我们需要在代理方法中处理这些数据。NSConnectionDelegate 协议中定义了一些代理方法,我们可以在这些方法中获取到服务器返回的数据。

objective-c

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response {

// 在接收到服务器的响应后,我们可以初始化一个 NSMutableData 对象来存储响应数据

self.mutableData = [[NSMutableData alloc] init];

}

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data {

// 在接收到服务器返回的数据后,我们可以将数据追加到之前创建的 NSMutableData 对象中

[self.mutableData appendData:data];

}

- (void)connectionDidFinishLoading:(NSURLConnection *)connection {

// 在接收完所有数据后,我们可以对数据进行解析或者展示在界面上

NSDictionary *jsonData = [NSJSONSerialization JSONObjectWithData:self.mutableData options:kNilOptions error:nil];

NSLog(@"Received JSON data: %@", jsonData);

}

- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error {

// 在请求失败时,我们可以根据错误信息进行处理

NSLog(@"Connection failed with error: %@", error.localizedDescription);

}

在上述代码中,我们实现了 NSURLConnectionDelegate 协议中的几个代理方法。在接收到服务器的响应后,我们可以在 didReceiveResponse: 方法中初始化一个 NSMutableData 对象来存储响应数据。然后,在 didReceiveData: 方法中将服务器返回的数据追加到 NSMutableData 对象中。最后,在 connectionDidFinishLoading: 方法中,我们可以对数据进行解析或者展示在界面上。

使用 GCD 将网络请求放在后台线程中

为了避免网络请求阻塞主线程,我们可以使用 GCD 将网络请求放在后台线程中进行。这样,即使网络请求耗时较长,也不会影响用户界面的响应。

objective-c

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

// 在后台线程中进行网络请求

NSURL *url = [NSURL URLWithString:@"https://api.example.com/data"];

NSURLRequest *request = [NSURLRequest requestWithURL:url];

NSData *responseData = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];

// 在主线程中更新界面

dispatch_async(dispatch_get_main_queue(), ^{

// 在这里处理响应数据

NSDictionary *jsonData = [NSJSONSerialization JSONObjectWithData:responseData options:kNilOptions error:nil];

NSLog(@"Received JSON data: %@", jsonData);

});

});

在上述代码中,我们使用 dispatch_async 函数将网络请求放在了后台线程中进行。在后台线程中,我们使用 NSURLConnection 的 sendSynchronousRequest:returningResponse:error: 方法来进行网络请求,并获取到服务器返回的数据。然后,在主线程中使用 dispatch_async 函数将数据处理的代码放在了主线程中执行,以便更新界面。

通过 NSURLConnection 和 NSData + GCD 的组合,我们可以方便地进行网络请求,并对响应数据进行处理。使用 NSURLConnection 发起网络请求,使用 NSData 处理响应数据,同时使用 GCD 将网络请求放在后台线程中进行,可以保证用户界面的流畅性。在实际的项目中,我们可以根据具体的需求选择适合的网络请求方式,并根据服务器返回的数据进行相应的处理。