今天开始打算总结一下在iOS开发中的网络部分
NSURLConnection 这个访问网络的方式最简单,但功能也是最少的因此只有很简单的网络访问才会用到;
使用NSURLConnection访问网络大致分为四个步骤
- 生成一个可用的URL
- 通过上一步的URL生成一个NSURLRequestion对象
- 建立一个NSURLConnection并启动连接
- 连接完成处理所得到的数据
下面我们开始前三步吧
1
2
3
4
5
6
7
8
9
10
|
// 如果URL中含有中文的话要用下面这一句转换成带百分号的unicode才可以 // urlString=[urlString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; NSURL
*url=[ NSURL
URLWithString:urlString];
// 其实也有只传入url就可以创建一个,但是最好还是加上缓存策略,以及超时时间比较好一点 NSURLRequest
*request=[ NSURLRequest
requestWithURL:url cachePolicy: NSURLRequestUseProtocolCachePolicy
timeoutInterval:2.0];
// 这里的代理就用控制器好了不过要遵守<NSURLConnectionDataDelegate>协议来处理收到的数据 NSURLConnection
*connection=[[ NSURLConnection
alloc]initWithRequest:request delegate: self ];
//启动连接,连接可以在上一行调用另一个方法可以在创建完毕时启动,就是用再多一个参数的构造方法就可以,不过最好还是手动启动 [connection start];
|
NSURLConnection的类方法也有可以直接在生成对象之后直接启动的,但是最好还是手动启动比较好
上面几行代码就是准备工作了,接下来我们开始编写代理方法
1
2
3
4
5
|
#pragma mark 开始发送请求 -( void )connection:( NSURLConnection
*)connection didReceiveResponse:( NSURLResponse
*)response
{ _data=[ NSMutableData
data];
} |
这个方法在连接收到服务器的响应的时候调用,用于完成数据接收的准备工作.
我在类扩展里声明了一个成员变量_data用于存储返回的数据在这里实例化一下也可以在下一个方法里面懒加载
接下来就是接收数据了
1
2
3
4
5
6
7
8
9
|
#pragma mark 收到了返回数据 -( void )connection:( NSURLConnection
*)connection didReceiveData:( NSData
*)data
{ //这个应该算是懒加载,这里写了其实上面的方法里面就不需要写了 if
( nil ==_data) {
_data=[ NSMutableData
data];
}
[_data appendData:data];
} |
值得注意的是这个方法是会反复调用的,不论是请求多小的数据都有可能会反复调用,所以需要一个可变的_data成员变量来拼接一下数据
接下来是完成加载
1
2
3
4
5
6
7
8
9
|
#pragma mark 加载数据完成 - ( void )connectionDidFinishLoading:( NSURLConnection
*)connection
{ NSString
*str=[[ NSString
alloc]initWithData:_data encoding: NSUTF8StringEncoding ];
//baseurl基础URL用于网站资源的访问,这里写的就过于简单了,其实baseurl应该动态获取的
_data= nil ;
} |
当数据传输完成的时候会调用这个方法,用来处理一下接收到的数据吧,我这里因为以访问百度页面为例所以返回的就是一个html的数据,把它转成字符串,然后用一个webView加载一下就可以显示出来了,这里也可以用来下载数据
接下来是错误处理页面了
1
2
3
4
|
-( void )connection:( NSURLConnection
*)connection didFailWithError:( NSError
*)error
{ NSLog (@ "%@" ,error.localizedDescription);
} |
我这里只是输出了一下错误,也可以在这里重新启动一下连接
其实在实际开发中NSURLConnection只适合处理一些简单的网络连接工作,当处理一些复杂的协议的时候就比较蛋疼了,一般都在用asi和afn框架,同时令人振奋的是苹果在ios7推出了NSURLSession,好吧 我只能说现在iOS所有网络访问第三方框架基本都可以退休了,我会在最近更新几篇关于各个网络访问框架的帖子,关于afn和NSURLSession的.至于asi....关于这个作者突然失踪的框架,虽然很好用,但是真的没必要再用了