您的位置:首页 > 理论基础 > 计算机网络

ios开发之网络编程 分类: ios开发 2014-12-09 15:18 146人阅读 评论(0) 收藏

2014-12-09 15:18 543 查看
上周末本应早写这个网络和MapKit的。

由于周六朋友聚会,周日送一朋友回远方,吃吃喝喝的就忘掉了。

网络编程基本是移动互联这块中必须掌握的编程技巧。由于我买的的小柚子书上没有这块,

最近刚买的开发秘籍那本上的关于网络链接这块,太抽象了。

首先吐槽一下这本书,细节描述的还是不错的。但是不合适做入门~

然后在网络上搜索关于ios的网络编程基本就首页全是讲的同一篇文章,被转烂了。

找了半天没找到源文出处。

可以参考的一个地址:http://www.cocoachina.com/bbs/read.php?tid-31300.html

主要将了两部分:1.网络检测;2.简单的NSURLConnection链接以及设置代理。

问了下朋友,基本说现在都用

HTTP包装开源项目ASIHTTPRequest。

但这边我们还是从最原始的框架提供的API入手,后边我再去看下这个。

这边我就以最简单的例子来引入几个常用的API中的类。

[cpp] view
plaincopy

//

// NLViewController.m

// NetWorkTest

//

// Created by Nono on 12-5-16.

// Copyright (c) 2012年 NonoWithLilith. All rights reserved.

//

#import "NLViewController.h"

@interface NLViewController ()

@end

@implementation NLViewController

@synthesize label = _label;

@synthesize data = _data;

@synthesize connection = _connection;

- (void)dealloc{

[self.label release];

[self.data release];

[super dealloc];

}

- (void)viewDidLoad

{

[super viewDidLoad];

UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(10.0, 10.0, 300.0, 400)];

self.label = label;

label.textAlignment = UITextAlignmentCenter;

[label setNumberOfLines:0];

label.lineBreakMode = UILineBreakModeWordWrap;

self.label.text = @"正在在请求数据";

[self.view addSubview:label];

[label release];

//step 1:请求地址

NSString *urlString = @"http://www.google.com";

NSURL *url = [NSURL URLWithString:urlString];

//step 2:实例化一个request

NSURLRequest *requrst = [NSURLRequest requestWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:30.0];

//step 3:创建链接

self.connection = [[NSURLConnection alloc] initWithRequest:requrst delegate:self];

if ( self.connection) {

NSLog(@"链接成功");

}else {

NSLog(@"链接失败");

}

[url release];

[urlString release];

[requrst release];

// Do any additional setup after loading the view, typically from a nib.

}

- (void)viewDidUnload

{

self.label = nil;

self.data = nil;

[super viewDidUnload];

// Release any retained subviews of the main view.

}

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation

{

return (interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown);

}

#pragma mark-

#pragma NSUrlConnectionDelegate methods

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

{

//接受一个服务端回话,再次一般初始化接受数据的对象

NSLog(@"返回数据类型:%@",[response textEncodingName]);

NSMutableData *d = [[NSMutableData alloc] init];

self.data = d;

[d release];

}

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

{

//接受返回数据,这个方法可能会被调用多次,因此将多次返回数据加起来

NSUInteger datalength = [data length];

NSLog(@"返回数据量:%d",datalength);

[self.data appendData:data];

}

- (void)connectionDidFinishLoading:(NSURLConnection *)connection

{

//连接结束

NSLog(@"%d:",[self.data length]);

NSStringEncoding enc = CFStringConvertEncodingToNSStringEncoding(kCFStringEncodingGB_18030_2000);

NSString *mystr = [[NSString alloc] initWithData:_data encoding:enc];

// string i

NSLog(@"最后的结果:%@",mystr);

self.label.text = mystr;

[mystr release];

[self.connection release];

}

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

{

//链接错误

}

@end

简单说下:

1.最简单的网络链接,一个url,一个request,一个connection以及一个response返回。默认的是get请求。

2.data转码问题,这个一开始有点纠结。即,在最后我们要把NSData转化成NSString时候需要一个转码格式,一开始我习惯性的用了UTF-8,

然后发现转化后String 是Null,于是去打印了下请求返回的一些参数,显示的是GB2312~。

然后NSStringEncoding enc = CFStringConvertEncodingToNSStringEncoding(kCFStringEncodingGB_18030_2000);

NSString *mystr = [[NSString alloc] initWithData:_data encoding:enc];

就ok了。

4.代理方法的实现,基本以上几个都需要实现吧。还有更多可选方法可以根据自身需要去选择性实现。

但是,显然,以上这个小例子真的太基础,可能根本不能满足我们的需求,至少得有个post的列子。

然后我看了几个勉强有网络链接demo,写的比较随意化,最后在 ios developer 中找到一个官方版的比较文正规范的例子。

http://developer.apple.com/library/ios/#samplecode/SimpleURLConnections/Introduction/Intro.html#//apple_ref/doc/uid/DTS40009245

这边也提下,官网的例子很多,也都比较规范化,我们新入门者可以多多参考。

基本上面一个例子就对sdk自带的网络api学习就算完整了。

在加上上面那个提及到的网络检测,至少,现在我们对网络这块有个大致了解。

如果想要自己考虑到上传,下载,像java自己去封装一个网络库。那就多研究下开源库。

据说上面提到那个库很强大,很简洁,也很容易入门

我这边只是简单介绍了网络开发这块几个入门点和入门资料。

有不足忘指出。

还有,哪位大神能帮我比较详细的解答下这个问题

http://www.cocoachina.com/bbs/read.php?tid=103569
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐