首页 > 白话Cocoa > Cocoa网络编程总结之NSURLConnection

Cocoa网络编程总结之NSURLConnection

CoreFoundation中提供了一个类NSURLConnection,用于处理用户的网络请求,NSURLConnection基本可以满足我们大多数的网络请求操作。
因为在项目中用得比较多,在此对NSURLConnection的使用做一番简洁的总结。

1、同步请求,采用sendAsynchronousRequest

+ (NSData *)sendSynchronousRequest:(NSURLRequest *)request returningResponse:(NSURLResponse **)response error:(NSError **)error;
这个同步请求是阻塞的,并且不可以中途cancel掉
我们可以将同步请求放到主线程之外的线程中,执行效果也会类似于异步,比如放到gcd的dispatch_async里面执行
示例在源代码中的sendSynchronousRequestExample函数

2、异步请求,采用sendAsynchronousRequest

+ (void)sendAsynchronousRequest:(NSURLRequest*) request
                          queue:(NSOperationQueue*) queue
              completionHandler:(void (^)(NSURLResponse* response, NSData* data, NSError* connectionError)) handler NS_AVAILABLE(10_7, 5_0);
这个异步请求是非阻塞的,异步执行后把结果通过block回调回来
不能中途cancel掉
示例在源代码中的sendASynchronousRequestExample函数

3、异步请求,采用initWithRequest

- (id)initWithRequest:(NSURLRequest *)request delegate:(id)delegate;

可以在delegate类里面的下列代理函数,获取异步请求的返回的数据与结果

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
- (void)connectionDidFinishLoading:(NSURLConnection *)connection
- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error
这个异步请求是非阻塞的,异步执行后把返回的数据与结果通过delegate函数回调回来
可以采用cancel中途取消
示例在源代码中的initWithRequestExample函数
另外,我们可以调用NSURLRequest 的函数setHTTPMethod,来决定是采用get还是post方式,比如post方式:[urlRequest setHTTPMethod:@"POST"];post方式的示例在源代码中的initWithRequestPostExample函数

4、第三方的网络组件

除了NSURLConnection之外,还有第三方的网络组件,比如ASIHTTPRequest跟AFNetworking,都是大家用得比较多的。这些第三方的网络组件封装了一些常用功能,满足基本需求,同时也做了更多的扩展,可以处理更加复杂的需求。

想实现更复杂的功能,甚至可以直接用socket,因为socket才是最底层的

源代码:
https://github.com/helloitworks/NSURLConnection

参考资料:
https://developer.apple.com/library/mac/documentation/cocoa/Conceptual/URLLoadingSystem/Tasks/UsingNSURLConnection.html#//apple_ref/doc/uid/20001836-BAJEAIEE

(转载本站文章请注明出处 www.helloitworks.com ,请勿用于任何商业用途)

分类: 白话Cocoa 标签: ,
  1. 本文目前尚无任何评论.
  1. 本文目前尚无任何 trackbacks 和 pingbacks.