1 SBJson的使用
JSON是一种数据交换语言,和XML是同样用途的。不过JSON的体积要比XML小,也就意味着在网络传输中
速度会比XML更快。
这里可以看到更多关于json的资料:http://www.json.org/json-zh.html
其实说白了 JSON无非就是一种字符串的结构。。。 那么在IPHONE开发中,使用最多的JSON解析库就是
SBJson。。
在这里可以得到 SBJson:http://stig.github.com/json-framework/
3.1版本及以上,它将支持ARC。下载下来后,解压缩,然后把Class目录下的所有文件导入项目中。
在使用SBJson时候,
<pre name="code" class="objc">#import "SBJson.h"
NSString *jsonStr = @"{\"name\":\"jia\",\"age\":\"24\"}";
NSString *jsonStr2 = @"[\"1\",\"2\"]";
SBJsonParser *jsonParser = [[SBJsonParser alloc] init];
NSMutableDictionary *dict = [jsonParser objectWithString:jsonStr];
NSLog(@"%@",dict);
NSMutableArray *arr = [jsonParser objectWithString:jsonStr2];
NSLog(@"%@",arr);
[jsonParser release];
2 MWPhotoBrowser使用
https://github.com/mwaterfall/MWPhotoBrowser
一个可选的网格视图简单的iOS照片浏览器,标题和选择。
mwphotobrowser可以通过提供uiimage对象显示一个或多个图像,或URL的Web图像文件,或图书馆资产。
照片处理下载和缓存浏览器从Web照片无缝。照片可以放大和平移,和可选的标题可以显示(可定制)。
浏览器也可以用于允许用户选择一个或更多的照片可以使用网格或主视图。
mwphotobrowser的设计是一个导航控制器内。只需设置代表(必须符合mwphotobrowserdelegate)和实
施所需的2代表方法提供的图片浏览器在mwphoto对象形式的数据。你可以通过提供一个uiimage对象创建
一个mwphoto对象,或包含一个文件的路径,在线图片或从资产库资产。
mwphoto对象句柄缓存,文件管理,下载网页图片,和你不同的优化。如果你想用你自己的数据模型来表
示的照片你可以确保你的模型符合mwphoto协议。然后你可以处理的管理缓存,下载,等等,你自己。更
多这方面的资料,可以发现在mwphotoprotocol。H。
看下面的代码片断的一个例子,如何实现图片浏览器。也有在项目的一个简单的演示程序。
- (void)viewDidLoad
{
[super viewDidLoad];
// Browser
NSMutableArray *photos = [[NSMutableArray alloc] init];
NSMutableArray *thumbs = [[NSMutableArray alloc] init];
MWPhoto *photo;
BOOL displayActionButton = NO;
BOOL displaySelectionButtons = NO;
BOOL displayNavArrows = NO;
BOOL enableGrid = YES;
BOOL startOnGrid = NO;
// Photos
photo = [MWPhoto photoWithImage:[UIImage imageWithContentsOfFile:[[NSBundle mainBundle]
pathForResource:@"photo5" ofType:@"jpg"]]];
photo.caption = @"Fireworks";
[photos addObject:photo];
photo = [MWPhoto photoWithURL:[NSURL fileURLWithPath:[[NSBundle mainBundle]
pathForResource:@"photo2" ofType:@"jpg"]]];
photo.caption = @"The London Eye is a giant Ferris wheel situated on the banks of the
River Thames, in London, England.";
[photos addObject:photo];
photo = [MWPhoto photoWithURL:[NSURL fileURLWithPath:[[NSBundle mainBundle]
pathForResource:@"photo3" ofType:@"jpg"]]];
photo.caption = @"York Floods";
[photos addObject:photo];
photo = [MWPhoto photoWithImage:[UIImage imageWithContentsOfFile:[[NSBundle mainBundle]
pathForResource:@"photo4" ofType:@"jpg"]]];
photo.caption = @"Campervan";
[photos addObject:photo];
// Options
self.photos = photos;
self.thumbs = thumbs;
//
// Create browser
MWPhotoBrowser *browser = [[MWPhotoBrowser alloc] initWithDelegate:self];
browser.displayActionButton = displayActionButton;//分享按钮,默认是
browser.displayNavArrows = displayNavArrows;//左右分页切换,默认否
browser.displaySelectionButtons = displaySelectionButtons;//是否显示选择按钮在图片上,默
认否
browser.alwaysShowControls = displaySelectionButtons;//控制条件控件 是否显示,默认否
browser.zoomPhotosToFill = NO;//是否全屏,默认是
#if __IPHONE_OS_VERSION_MIN_REQUIRED < __IPHONE_7_0
browser.wantsFullScreenLayout = YES;//是否全屏
#endif
browser.enableGrid = enableGrid;//是否允许用网格查看所有图片,默认是
browser.startOnGrid = startOnGrid;//是否第一张,默认否
browser.enableSwipeToDismiss = YES;
[browser showNextPhotoAnimated:YES];
[browser showPreviousPhotoAnimated:YES];
[browser setCurrentPhotoIndex:1];
browser.photoTitles = @[@"000",@"111",@"222",@"333"];//标题
// [self presentViewController:browser animated:YES completion:nil];
[self.navigationController pushViewController:browser animated:NO];
}
#pragma mark - MWPhotoBrowserDelegate
- (NSUInteger)numberOfPhotosInPhotoBrowser:(MWPhotoBrowser *)photoBrowser {
return _photos.count;
}
- (id )photoBrowser:(MWPhotoBrowser *)photoBrowser photoAtIndex:(NSUInteger)index {
if (index < _photos.count)
return [_photos objectAtIndex:index];
return nil;
}
3 iOS开发网络数据之AFNetworking使用
http网络库是集XML解析,Json解析,网络图片下载,plist解析,数据流请求操作,上传,下载,缓存
等网络众多功能于一身的强大的类库。最新版本支持session,xctool单元测试。网络获取数据一直是手
机软件的重中之重,如果处理的不好,会造成很差的用户体验。随着ASIHTTPRequest的停止更新,更换
网络库是必然的事情,AFNetworking就是很好的替代品。而且都是轻量级,不要担心加入太多库会多软
件性能有影响。
1.为什么用第三方网络库?先说如果不用网络库,我曾有一次觉得什么都用苹果原生的好,XML解析用苹
果自带的委托,下载图片自己写,如果你也有跟我一样的经历,那你会发现自己管理起来很复杂,很容
易出错。而且性能不好。如果你是一个追求完美的人,那就放下你的固执,就如当初的我一样,尝试一
下网络库吧。
2.为什么要用AFNetworking?第一点,它有人更新和维护,而且目前使用者很多,第二点,还是使用者很
多,那么他的资料,文档,demo就多,很好找遇到问题好解决。如果不用AFNetworking,还有一种
MKNetworkKit也不错,不妨一试。
如何选择AFNetworking版本
首先得下载AFNetworking库文件,下载时得首先弄清楚,你将要开发的软件兼容的最低版本是多少。
AFNetworking 2.0或者之后的版本需要xcode5.0版本并且只能为IOS6或更高的手机系统上运行,如果开
发MAC程序,那么2.0版本只能在MAC OS X 10.8或者更高的版本上运行。
AFNetworking 2.0的下载地址https://github.com/AFNetworking/AFNetworking
如果你想要兼容IOS5或MAC OS X 10.7,那你需要用最新发布的1.x版本
AFNetworking 1.x的下载地址https://github.com/AFNetworking/AFNetworking/tree/1.x
如果要兼容4.3或者MAC OS X 10.6,需要用最新发布的0.10.x版本
AFNetworking 0.10.xhttps://github.com/AFNetworking/AFNetworking/tree/0.10.x
2013年大多数软件兼容的最低版本为4.3,而2014年,估计大多数软件兼容的最低版本将会是5.0甚至6.0
;
所以,目前最好的选择还是1.x版本,兼容到IOS5.0。
如何通过URL获取json数据
第一种,利用AFJSONRequestOperation,官方网站上给的例子:
NSString *str=[NSString stringWithFormat:@"https://alpha-
api.app.net/stream/0/posts/stream/global"];
NSURL *url = [NSURL URLWithString:[str
stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];
NSURLRequest *request = [NSURLRequest requestWithURL:url];
// 从URL获取json数据
AFJSONRequestOperation *operation1 = [AFJSONRequestOperation
JSONRequestOperationWithRequest:request success:^(NSURLRequest *request, NSHTTPURLResponse
*response, NSDictionary* JSON) {
NSLog(@"获取到的数据为:%@",JSON);
} failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error, id
data) {
NSLog(@"发生错误!%@",error);
}];
[operation1 start];
第二种方法,利用AFHTTPRequestOperation 先获取到字符串形式的数据,然后转换成json格式,将
NSString格式的数据转换成json数据,利用IOS5自带的json解析方法:
NSString *str=[NSString stringWithFormat:@"https://alpha-
api.app.net/stream/0/posts/stream/global"];
NSURL *url = [NSURL URLWithString:[str
stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];
NSURLRequest *request = [NSURLRequest requestWithURL:url];
AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc]
initWithRequest:request];
[operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id
responseObject) {
NSString *html = operation.responseString;
NSData* data=[html dataUsingEncoding:NSUTF8StringEncoding];
id dict=[NSJSONSerialization JSONObjectWithData:data options:0 error:nil];
NSLog(@"获取到的数据为:%@",dict);
}failure:^(AFHTTPRequestOperation *operation, NSError *error) {
NSLog(@"发生错误!%@",error);
}];
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
[queue addOperation:operation];
如果发生Error Domain=NSURLErrorDomain Code=-1000 "bad URL" UserInfo=0x14defc80
{NSUnderlyingError=0x14deea10 "bad URL", NSLocalizedDescription=bad URL这个错误,请检查URL
编码格式。有没有进行stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding
如何通过URL获取图片
异步获取图片,通过队列实现,而且图片会有缓存,在下次请求相同的链接时,系统会自动调用缓存,
而不从网上请求数据。
UIImageView *imageView = [[UIImageView alloc] initWithFrame:CGRectMake(0.0f, 100.0f,
100.0f, 100.0f)];
[imageView setImageWithURL:[NSURL URLWithString:@"http://i.imgur.com/r4uwx.jpg"]
placeholderImage:[UIImage imageNamed:@"placeholder-avatar"]];
[self.view addSubview:imageView];
上面的方法是官方提供的,还有一种方法,
NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL
URLWithString:@"http://www.scott-sherwood.com/wp-content/uploads/2013/01/scene.png"]];
AFImageRequestOperation *operation = [AFImageRequestOperation
imageRequestOperationWithRequest:request imageProcessingBlock:nil success:^(NSURLRequest
*request, NSHTTPURLResponse *response, UIImage *image) {
self.backgroundImageView.image = image;
} failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error) {
NSLog(@"Error %@",error);
}];
[operation start];
如果使用第一种URLWithString: placeholderImage:会有更多的细节处理,其实实现还是通过
AFImageRequestOperation处理,可以点击URLWithString: placeholderImage:方法进去看一下就一
目了然了。所以我觉得还是用第一种好。
如何通过URL获取plist文件
通过url获取plist文件的内容,用的很少,这个方法在官方提供的方法里面没有
NSString *weatherUrl = @"http://www.calinks.com.cn/buick/kls/Buickhousekeeper.plist";
NSURL *url = [NSURL URLWithString:[weatherUrl
stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];
NSURLRequest *request = [NSURLRequest requestWithURL:url];
[AFPropertyListRequestOperation addAcceptableContentTypes:[NSSet
setWithObject:@"text/plain"]];
AFPropertyListRequestOperation *operation = [AFPropertyListRequestOperation
propertyListRequestOperationWithRequest:request success:^(NSURLRequest *request,
NSHTTPURLResponse *response, id propertyList) {
NSLog(@"%@",(NSDictionary *)propertyList);
}failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error, id
propertyList) {
NSLog(@"%@",error);
}];
[operation start];
如果稍不留神,可能就出现Error Domain=AFNetworkingErrorDomain Code=-1016 "Expected content
type {(
"application/x-plist"
)}, got text/plain" UserInfo=0x16e91ce0 {NSLocalizedRecoverySuggestion=
...
...
, AFNetworkingOperationFailingURLRequestErrorKey= { }, NSErrorFailingURLKey=,
NSLocalizedDescription=Expected content type {(
"application/x-plist"
)}, got text/plain, AFNetworkingOperationFailinponseErrorKey= { URL: } { status code: 200,
headers {
"Accept-Ranges" = bytes;
Connection = "keep-alive";
"Content-Length" = 974;
"Content-Type" = "text/plain";
Date = "Sat, 25 Jan 2014 07:29:26 GMT";
Etag = ""1014c2-3ce-4ee63e1c80e00"";
"Last-Modified" = "Wed, 25 Dec 2013 23:04:24 GMT";
Server = "nginx/1.4.2";
} }}
可能还会出现乱码,解决办法就是[AFPropertyListRequestOperation addAcceptableContentTypes:
[NSSet setWithObject:@"text/plain"]];
如何通过URL获取XML数据
xml解析使用AFXMLRequestOperation,需要实现苹果自带的NSXMLParserDelegate委托方法,XML中有一
些不需要的协议格式内容,所以就不能像json那样解析,还得实现委托。我之前有想过能否所有的XML链
接用一个类处理,而且跟服务端做了沟通,结果很不方便,效果不好。XML大多标签不同,格式也不固定
,所以就有问题,使用json就要方便的多。
第一步;在.h文件中加入委托NSXMLParserDelegate
第二步;在.m文件方法中加入代码
NSURL *url = [NSURL URLWithString:@"http://113.106.90.22:5244/sshopinfo"];
NSURLRequest *request = [NSURLRequest requestWithURL:url];
AFXMLRequestOperation *operation =
[AFXMLRequestOperation XMLParserRequestOperationWithRequest:request success:^
(NSURLRequest *request, NSHTTPURLResponse *response, NSXMLParser *XMLParser) {
XMLParser.delegate = self;
[XMLParser setShouldProcessNamespaces:YES];
[XMLParser parse];
}failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error,
NSXMLParser *XMLParser) {
NSLog(@"%@",error);
}];
[operation start];
第三步;在.m文件中实现委托方法
//在文档开始的时候触发
-(void)parserDidStartDocument:(NSXMLParser *)parser{
NSLog(@"解析开始!");
}
//解析起始标记
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:
(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)
attributeDict{
NSLog(@"标记:%@",elementName);
}
//解析文本节点
- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string{
NSLog(@"值:%@",string);
}
//解析结束标记
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:
(NSString *)namespaceURI qualifiedName:(NSString *)qName{
NSLog(@"结束标记:%@",elementName);
}
//文档结束时触发
-(void) parserDidEndDocument:(NSXMLParser *)parser{
NSLog(@"解析结束!");
}
运行的结果:
如何使用AFHTTPClient进行web service操作
AFHTTPClient处理GET 和 POST请求.做网页的朋友们这个方法用的比较多。在要经常调用某个请求时,
可以封装,节省资源。
BaseURLString = @"http://www.raywenderlich.com/downloads/weather_sample/";
NSURL *baseURL = [NSURL URLWithString:[NSString stringWithFormat:BaseURLString]];
NSDictionary *parameters = [NSDictionary dictionaryWithObject:@"json"
forKey:@"format"];
AFHTTPClient *client = [[AFHTTPClient alloc] initWithBaseURL:baseURL];
[client registerHTTPOperationClass:[AFJSONRequestOperation class]];
[client setDefaultHeader:@"Accept" value:@"text/html"];
[client postPath:@"weather.php" parameters:parameters success:^(AFHTTPRequestOperation
*operation, id responseObject) {
NSString* newStr = [[NSString alloc] initWithData:responseObject
encoding:NSUTF8StringEncoding];
NSLog(@"POST请求:%@",newStr);
}failure:^(AFHTTPRequestOperation *operation, NSError *error) {
NSLog(@"%@",error);
}];
[client getPath:@"weather.php" parameters:parameters success:^(AFHTTPRequestOperation
*operation, id responseObject) {
NSString* newStr = [[NSString alloc] initWithData:responseObject
encoding:NSUTF8StringEncoding];
NSLog(@"GET请求:%@",newStr);
}failure:^(AFHTTPRequestOperation *operation, NSError *error) {
NSLog(@"%@",error);
}];
运行结果:
如果需要显示网络活动指示器,可以用下面方法:
[AFNetworkActivityIndicatorManager sharedManager].enabled = YES;
Error: Error Domain=AFNetworkingErrorDomain Code=-1016 "Request failed: unacceptable
content-type: text/html" UserInfo=0x16774de0
{NSErrorFailingURLKey=http://192.168.2.2:8181/ecar/tsp/uploadLocation?
CID=781666&serviceType=1, AFNetworkingOperationFailinponseErrorKey= { URL:
http://192.168.2.2:8181/ecar/tsp/uploadLocation?CID=781666&serviceType=1 } { status code:
200, headers {
XXX
} }, NSLocalizedDescription=Request failed: unacceptable content-type: text/html}
返回数据格式不对。注销这句话: op.responseSerializer = [AFJSONResponseSerializer
serializer];然后将返回的数据自己转换。
4 NSXMLParser和GDataXMLNode两种解析方式
iPhone中两种XML解析方式NSXMLParser和GDataXMLNode是本文要介绍的内容,很详细的介绍了
NSXMLParser和GDataXMLNode这两种方式,常用的解析XML的方式分为两种,它们基于不同的API:
1.Tree-based API:这种API的处理方式是将XML的结构看成是树,然后把树的各部分看成一个对象
来处理,这就是我们说的DOM (Document Object Model)方式 。在iPhone的SDK里包含了一个libxml2的
框架(Framework)就能进行DOM解析方式 。Google的GDataXML也是基于libxml2的,因此在使用GDataXML
之前,你需要先导入libxml2 。
2.Event-driven API:这种方式通常用于解析基于的事件,SAX解析方式就是这种解析方式的代表
。在iPhone开发的,也可以利用这种方式来解析XML,不过这可不是Iphone SDK的属性啊,而是
Objective-C的功能 。在Objectvie-C种有专门解析XML的类NSXMLParser 。
NSXMLParser和CGataXML的使用方法:
NSXMLParser解析方式
NSXMLParser解析XML的主要工作都是靠它的代理(NSXMLParserDelegate)来实现的 。
- (void)viewDidLoad {
[super viewDidLoad];
//........
NSXMLParser *parser = [[NSXMLParser alloc] initWithContentsOfURL:[NSURL
URLWithString:@"http://lab.xxxxxx.com/xxx/xxx.xml"]];
[parser setDelegate:self];
[parser parse];
for (int i = 0; i < [newsArray count]; i++) {
NSLog(@"%@",[newsArray objectAtIndex:i]);
}
}
就这么几句,就开始解析了,怎样得到XML里面的数据呢?
那就去代理里面找吧!
#pragma mark NSMXLParser Delegate Methods
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName
namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:
(NSDictionary *)attributeDict{
if ([elementName isEqualToString:@"docTitle"]) {
if (!newsArray) {
newsArray = [[NSMutableArray alloc] init];
return;
}
}
}
- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string{
if (!currentString) {
currentString = [[NSMutableString alloc] init];
}
[currentString appendString:string];
[currentString setString:[currentString stringByTrimmingCharactersInSet:[NSCharacterSet
whitespaceAndNewlineCharacterSet]]];
}
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName
namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName{
if ([elementName isEqualToString:@"docTitle"]) {
[newsArray addObject:currentString];
}
[currentString release];
currentString = nil;
}
先说一下程序运行的流程,当parser初始化并执行parse语句时([parser parse]),程序会跳到代理
方法里面走第一个代理方法 。第一个代理方法会将整个xml遍历一遍,并识别xml里面的元素名称
(elementName),在发现有我想找的信息(docTitle)时,创建一个数组用来存储这些信息,当然第一个代
理还没开始存储信息 。
接下来会走第二个代理,它会把第一个代理中我们相要找的信息存储在currentString中 。其中我
增加了一个对获取的字符串的处理语句 [currentString setString:[currentString
stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]],它可以
将字符串开始的空格和换行附去掉(因为常会遇到xml文件格式不太标准的) 。
最后是第三个代理方法,把我们获取的信息存储到数组中 。
当然程序运行过程中这三步的顺序并不是这么严格的执行的,而且会反复的执行,但是大致的处理
过程是这样的 。
DOM解析方式之GDataXMLNode
GDataXMLNode是基于libxml2的第三方文件,功能比较强大 。
NSError* error = nil;
NSString *documentStr = [[NSString alloc] initWithContentsOfURL:[NSURL
URLWithString:@"http://www.xxxx.com/x/xxx.xml"]
encoding:NSUTF8StringEncoding error:&error];
GDataXMLDocument* XMLdocument = [[GDataXMLDocument alloc] initWithXMLString:documentStr
options:0 error:&error];
[documentStr release];
GDataXMLElement* rootElement = [XMLdocument rootElement];
NSArray *newsArray = [rootElement elementsForName:@"docTitle"];
for (int i = 0; i < [newsArray count]; i++) {
NSLog(@"%@",[[newsArray objectAtIndex:i] stringValue]);
}
就这么几句,功能和上面的NSXMLParser,当然这个数组里存储的是GDataXMLElement的对象而不是
字符串 。
在DOM解析方式中,先将XML文件或链接转化成对象,这里是GDataXMLDocument对象,然后该对象里
面的每一部分都看成一个对象,如rootElement是一个GDataXMLElement对象,它是整个XML树的根,包含
了该XML的所有信息 。我们直接在rootElement下找名为:docTitle的对象,把它放在数组里面(因为
这样的对象可能不止一个) 。我们要取docTitle对象里面的内容hello iPhone,该对象的stringValue
就是 。
5 GDataXMLNode:xml解析库
一、GDataXMLNode说明
GDataXMLNode是Google提供的用于XML数据处理的类集。该类集对libxml2--DOM处理方式进行了封装,能
对较小或中等的xml文档进行读写操作且支持XPath语法。
使用方法:
1、获取GDataXMLNode.h/m文件,将GDataXMLNode.h/m文件添加到工程中
2、向工程中增加“libxml2.dylib”库
3、在工程的“Build Settings”页中找到“Header Search Path”项,添
加/usr/include/libxml2"到路径中
4、添加“GDataXMLNode.h”文件到头文件中,如工程能编译通过,则说明GDataXMLNode添加成功
二、GDataXMLNode示例
示例:
html
<root>
<name value="wusj"/>
<age>24</age>
</root>
对此xml文件进行解析
NSString *xmlPath = [[NSBundlemainBundle] pathForResource:@"test"ofType:@"xml"];
NSString *xmlString = [NSStringstringWithContentsOfFile:xmlPath
encoding:NSUTF8StringEncodingerror:nil];
GDataXMLDocument *xmlDoc = [[GDataXMLDocumentalloc] initWithXMLString:xmlString
options:0error:nil];
GDataXMLElement *xmlEle = [xmlDoc rootElement];
NSArray *array = [xmlEle children];
NSLog(@"count : %d", [array count]);
for (int i = 0; i < [array count]; i++) {
GDataXMLElement *ele = [array objectAtIndex:i];
// 根据标签名判断
if ([[ele name] isEqualToString:@"name"]) {
// 读标签里面的属性
NSLog(@"name --> %@", [[ele attributeForName:@"value"] stringValue]);
} else {
// 直接读标签间的String
NSLog(@"age --> %@", [ele stringValue]);
}
}
运行结果:
三、GDataXMLNode方法小结
最终的数据读出都是在GDataXMLElement对象中读出的,以下方法均为GDataXMLElement类的方法
1、name方法,取标签名 e.g name标签的名称“name”
2、attributeForName: 取属性结点 再调stringValue即可取到属性值 e.g name标签中的value属
性
3、stringValue: 取标签间的字符串值 e.g: age间的24
6 ASIHttpRequest
ASIHttpRequest是一个对CFNetwork API进行了封装,并且使用起来非常简单的一套http请求api。
官方地址:http://allseeing-i.com/ASIHTTPRequest/
依赖库:CFNetwork.framework、SystemConfiguration.framework、MobileCoreServices.framework、
CoreGraphics.framework和libs.1.2.3dylib
下面是简单的http请求示例:
1、同步的http请求
// 简单的同步请求示例
- (void)syncRequest {
NSURL *url = [NSURLURLWithString:@"http://www.weather.com.cn/data/sk/101010100.html"];
ASIHTTPRequest *request = [ASIHTTPRequestrequestWithURL:url];
[request startSynchronous];
NSError *error = [request error];
if (!error) {
NSString *response = [request responseString];
NSLog(@"Response :%@", response);
self.result.text = response;
} else {
self.result.text = @"error";
}
}
2、异步的http请求
// 简单的异步请求示例(代理实现)
- (void)asyncRequest {
NSURL *url =
[NSURLURLWithString:@"http://www.weather.com.cn/data/cityinfo/101010100.html"];
ASIHTTPRequest *request = [ASIHTTPRequestrequestWithURL:url];
request.delegate = self;
// 开始异步请求
[request startAsynchronous];
}
代理方法:
<pre name="code" class="objc">// 请求完成
- (void)requestFinished:(ASIHTTPRequest *)request
{
// 如果请求的是二进制数据,用responseData,用NSData接收
NSLog(@"异步请求成功返回");
self.result.text = [request responseString];
}
// 请求失败
- (void)requestFailed:(ASIHTTPRequest *)request
{
NSLog(@"异步请求失败");
self.result.text = @"error";
}
3、块语法实现的异步请求
<pre name="code" class="objc">// 简单的异步请求用块语法实现
- (void)asyncRequestBlock {
NSURL *url = [NSURLURLWithString:@"http://m.weather.com.cn/data/101010100.html"];
__blockASIHTTPRequest *request = [ASIHTTPRequestrequestWithURL:url];
[request setCompletionBlock:^{
// 请求响应结束
NSString *response = [request responseString];
self.result.text = response;
}];
[request setFailedBlock:^{
// 请求失败
NSError *error = [request error];
// self.result.text =
NSLog(@"error : %@", [error userInfo]);
}];
[request startAsynchronous];
}
7 IOS使用第三方工具(RegexKitLite)实现正则表达式
在IOS应用中,经常要输入数据,然输入数据,就要校验数据的合法性,这是我们很自然的联想
到web应用中的正则表达式。然而Cocoa并未支持正则表达式。这是我们可以使用第三方工具
(RegexKitLite)来实现正则表达式。
1、下载(RegexKitLite)类库,备用下载地址:RegexKitLite,将RegexKitLite.h/
RegexKitLite.m两个文件添加到您的项目中;
2、在您的工程中添加libicucore.dylib frameworks;
3、在您要校验的数据中使用RegexKitLite,这里假设校验一个电子邮箱
<pre name="code" class="objc">NSString *email = @"iMilo@163.com";
NSString *regex = @"\\b([a-zA-Z0-9%_.+\\-]+)@([a-zA-Z0-9.\\-]+?\\.[a-zA-Z]{2,6})\\b";
if ([email isMatchedByRegex:regex])
{
NSLog(@"通过校验!");
}
else
{
NSLog(@"未通过校验,数据格式有误,请检查!");
}
说明:查看RegexKitLite源代码,您会发现其实是对NSString的扩展,所以校验的数据必须是NSString
类型的。
1、在写正则表达式时:所有的’\’都需要转义,即:’\\’;
2、在很多JS的正则表达式可能是这样写,如:’/^\d{1,400}$/’,但是这样的表达式Objective-C中并
不能识别,通过实际调试得出,应将其写为:’ ^\\d{1,400}$’(即:去掉表达式头和尾的’/’)