IOS小贴士:Web服务交互

  • 资讯类型: 翻译
  • 来源页面: http://mobile.tutsplus.com/tutorials/iphone/ios-quick-tip-interacting-with-web-services/
  • 资讯原标题: iOS Quick Tip: Interacting with Web Services
  • 资讯原作者: Brandon Trebitowski
  • 翻译词数: 780 词
  • 我的评论:话说我其实不喜欢水果,可以的话我更愿意译android的,这篇通篇不懂,有问题也不要问我 
    对这篇文你有啥看法,跟贴说说吧!欢迎口水和板砖,哈哈。欢迎大家和我们一同分享更多资讯。
本帖最后由 十旋转45度 于 2012-5-5 18:53 编辑

web-services.png 
教程详情
技术:IOS SDK
难度:中级
完成时间:15 - 30分钟

iOS开发有时需要让应用程序与Web服务交互,您可能要访问远程数据,分析社交网络的反馈,或是下载素材(asset)到应用中。本贴士将介绍些不借用第三方库实现的方法!

当然,很多第三方库能简化Web服务交互,如ASIHTTPRequestAFNetworking以及RESTKit。虽然这些库很实用,但其实很多时候是杀鸡焉用牛刀的。三方库的使用会让内存会积累许多额外变量,给应用增加不少不必要的代码。另外,为了适应各库工作流还会被修改。

简化
曾几何时,我也习惯用这些库作为辅助,这样缩短了开发所需的时间并降低复杂度。当然,许多情况下确实是这样的,但不可能面面俱到。除非你对这些库引擎了若指掌,否则你很可能会增加了复杂度。

而今天,我要介绍一个非常简单的方法,是关于Web服务获取接口以及从网络上下载数据的。不久前,我就将此方法运用在我最新的iOS MUD客户端Pocket MUD Pro上来获取远程音频,设置以及数据。此方法涉及的“内置”技术关于下载,解析以及使用远程的JSON和素材,如图像和声音。

获取远程数据
在IOS版本4之前,异步获取数据是相当痛苦的,通常得为发送请求创建个类,为解析及响应再创建个类。借助Grand Central Dispatch(**)能够内联实现并让你的代码保持简洁。以下你所见的代码就是关于从网上远程获取JSON文件:
  1. dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

  2. dispatch_async(queue, ^{
  3.     NSError *error = nil;
  4.     NSURL *url = [NSURL URLWithString:@"http://brandontreb.com/apps/pocket-mud-pro/promo.json"];
  5.     NSString *json = [NSString stringWithContentsOfURL:url
  6.                                               encoding:NSASCIIStringEncoding
  7.                                                  error:&error];
  8.     NSLog(@"\nJSON: %@ \n Error: %@", json, error);
  9. });
复制代码


代码一开始先是获取苹果的3个调度队列之一,这些调度队列是可以异步执行的,并且以默认优先级运行代码块。当然,你也可以轻松创建自己的队列。无论用的哪种方式,借助Grand Central Dispatch(**)代码都能在主线程以外的单独的线程运行。

接着,我们创建了URL并塞入到NSString的方法stringWithContentsOfURL:encoding:error:用以获取JSON数据。最后,返回显示字符串与异常(若异常存在的话)。

此方法非常高效,但不好控制。虽然你能够获晓异常为何,但其不允许指定异常事件的超时属性。默认的超时时间为30秒左右,若你想为处理超时或其它什么行为添加额外控制,那将字符串方法替换为NSURLConnection。

解析JSON
苹果的iOS 5内置了JSON解析器,允许包含JSON的字符串,并能够将其转换成一个NSDictionary或一个NSArray。为了能解析,使用以上代码返回的JSON,在代码块末尾添加这些行:
  1. if(!error) {
  2.     NSData *jsonData = [json dataUsingEncoding:NSASCIIStringEncoding];
  3.     NSDictionary *jsonDict = [NSJSONSerialization JSONObjectWithData:jsonData
  4.                                                                 options:kNilOptions
  5.                                                                   error:&error];
  6.     NSLog(@"JSON: %@", jsonDict);
  7. }
复制代码


NSJSONSerialization类用于解析JSON字符串并将其转换为适应你的JASON格式的NSDictionary或NSArray。这样就轻松多了,而今你可以这样调用JSON字符串里的变量:
  1. NSString *promo_url = [jsonDict objectForKey:@"promo_url"];
复制代码


就是这样!这是一非常基础的方式,仅调用原生SDK类就可享有网络服务。好的,接下来介绍更有趣的部分......图像!

获取远程图像
我们可以使用上面介绍的方法获取任何类型的远程媒体。此例中,我会告诉你如何从人气博客XKCD下载图像。
  1. dispatch_queue_t img_queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
  2. dispatch_async(img_queue, ^{

  3.     NSURL *url = [NSURL URLWithString:@"http://imgs.xkcd.com/comics/formal_logic.png"];
  4.     NSError *error = nil;
  5.     NSData *image = [NSData dataWithContentsOfURL:url options:0 error:&error];

  6.     if(!error && image && [image length] > 0) {
  7.         NSArray *paths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES);
  8.         NSString *path = [[paths objectAtIndex:0] stringByAppendingPathComponent:@"image.png"];

  9.         [image writeToFile:path options:0 error:&error];
  10.     }
复制代码


同样,首先我们获取一个队列让其异步运行。接着,我们使用NSData的方法dataWithContentsOfURL:options:error:来获取的图像数据。一旦确认有数据返回,我们就得到了磁盘上缓存目录的引用,于是就能够保存图像。

就是这么简单!您可以如此使用获取的图像:
  1. UIImage *img = [UIImage imageWithData:image];
复制代码

结论
希望本文能够帮助你脱离为了实现网络交互对第三方库的依赖。你现在应该对如何创建一成熟的(full blown)互联网应用有所了解。若您有任何疑问或意见,请在这里留言或Twitter我
码字愉快!
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值