ios网络编程学习

//网络访问获取数据//定义一个UIWebView属性,用来展示数据
@property (strong, nonatomic) IBOutlet UIWebView *myWebView;

//.......

//使用NSURLConnection发送异步请求获取数据
- (void)getData:(id)sender{
    //访问的网站地址
    NSString *str = @"http://www.apple.com/";
    //实例化NSURL对象
    NSURL *url = [NSURL URLWithString:str];
    //实例化NSURLRequest对象
    NSURLRequest *request = [NSURLRequest requestWithURL:url];
    //实例化操作队列
    NSOperationQueue *queue = [[NSOperationQueue alloc] init];

    //发送异步请求
    [NSURLConnection sendAsynchronousRequest:request queue:queue completionHandler:
     ^(NSURLResponse *response, NSData *data, NSError *error) {
        //获得网络抓取的数据
         if ([data length] > 0 && error == nil){
             //将NSData转换为NSString
             NSString *html = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
             //使用UIWebView显示网页
             [self.myWebView loadHTMLString:html baseURL:nil];
             NSLog(@"html = %@", html);
         }
    }];
}

/*使用NSUrlConnection发送同步请求获得数据
 使用同步请求的时候,最好在单独的一个线程中进行,
 这样可以避免程序阻塞
 */
- (void)getDataTwo:(id)sender{
    //全局队列
    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

    //异步并行队列,开辟一个新线程
    dispatch_async(queue, ^{
        NSURL *url = [NSURL URLWithString:@"http://www.apple.com"];
        NSURLRequest *request = [NSURLRequest requestWithURL:url];
        NSURLResponse *response;
        NSError *error;

        //NSURLConnection发送同步请求,获得数据
        NSData *data = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];

        //判断结果
        if ([data length] > 0 && error == nil){
            NSString *html = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
            NSLog(@"html = %@", html);
        }
    });
}

  

/**
 *  使用NSMutableURLRequest向服务器发送POST请求获取数据
 */
- (void)getDataThree:(id)sender{
    //创建一个线程
    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    //执行异步任务
    dispatch_async(queue, ^{
       //获取新浪的天气预报信息网址
        //http://php.weather.sina.com.cn/xml.php?city=%B1%B1%BE%A9&password=DJOYnieT8234jlsK&day=0

        //在block中从网络获取数据
        NSString *str = @"http://php.weather.sina.com.cn/xml.php";
        //创建NSURL对象
        NSURL *url = [NSURL URLWithString:str];
        //可变URL请求
        NSMutableURLRequest *mRequest = [[NSMutableURLRequest alloc] init];
        //为请求设置URL
        [mRequest setURL:url];
        //设置请求超时时间
        [mRequest setTimeoutInterval:10];
        //设置请求方法为post
        [mRequest setHTTPMethod:@"POST"];
        //body内容
        NSString *body = @"city=%B1%B1%BE%A9&password=DJOYnieT8234jlsK&day=0";
        //设置body
        [mRequest setHTTPBody:[body dataUsingEncoding:NSUTF8StringEncoding]];

        //获得响应
        NSURLResponse *response;
        NSError *error;
        //获得返回数据
        NSData *data = [NSURLConnection sendSynchronousRequest:mRequest returningResponse:&response error:&error];
        //将NSData转换成字符串
        NSString *content = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];

        //使用UIWebView加载数据
        [self.myWebView loadHTMLString:content baseURL:nil];
        //输出结果
        NSLog(@"content = %@", content);

    });
}

  

数据解析

在网络编程中,从服务器获取的数据格式大致分为两种:JSON和XML。其中JSON作为一种轻量级的数据交换格式,正在逐步取代XML, 成为网络数据的通用格式。

测试列子:调用一个天气预报的API, 地址是:http://m.weather.com.cn/data/101010100.html

/**
 *  使用系统自带库NSJSONSerialization解析json数据
    访问http://m.weather.com.cn/data/101010100.html ,返回结果为:
 {"weatherinfo":{"city":"北京","city_en":"beijing","date_y":"2014年3月4日","date":"","week":"星期二","fchh":"11","cityid":"101010100","temp1":"8℃~-3℃","temp2":"8℃~-3℃","temp3":"7℃~-3℃","temp4":"8℃~-1℃","temp5":"10℃~1℃","temp6":"10℃~2℃","tempF1":"46.4℉~26.6℉","tempF2":"46.4℉~26.6℉","tempF3":"44.6℉~26.6℉","tempF4":"46.4℉~30.2℉","tempF5":"50℉~33.8℉","tempF6":"50℉~35.6℉","weather1":"晴","weather2":"晴","weather3":"晴","weather4":"晴转多云","weather5":"多云","weather6":"多云","img1":"0","img2":"99","img3":"0","img4":"99","img5":"0","img6":"99","img7":"0","img8":"1","img9":"1","img10":"99","img11":"1","img12":"99","img_single":"0","img_title1":"晴","img_title2":"晴","img_title3":"晴","img_title4":"晴","img_title5":"晴","img_title6":"晴","img_title7":"晴","img_title8":"多云","img_title9":"多云","img_title10":"多云","img_title11":"多云","img_title12":"多云","img_title_single":"晴","wind1":"北风4-5级转微风","wind2":"微风","wind3":"微风","wind4":"微风","wind5":"微风","wind6":"微风","fx1":"北风","fx2":"微风","fl1":"4-5级转小于3级","fl2":"小于3级","fl3":"小于3级","fl4":"小于3级","fl5":"小于3级","fl6":"小于3级","index":"寒冷","index_d":"天气寒冷,建议着厚羽绒服、毛皮大衣加厚毛衣等隆冬服装。年老体弱者尤其要注意保暖防冻。","index48":"冷","index48_d":"天气冷,建议着棉服、羽绒服、皮夹克加羊毛衫等冬季服装。年老体弱者宜着厚棉衣、冬大衣或厚羽绒服。","index_uv":"中等","index48_uv":"中等","index_xc":"较适宜","index_tr":"一般","index_co":"较舒适","st1":"7","st2":"-3","st3":"8","st4":"0","st5":"7","st6":"-1","index_cl":"较不宜","index_ls":"基本适宜","index_ag":"易发"}}
 */
- (void)getWeatherData:(id)sender{
    NSURL *url = [NSURL URLWithString:@"http://m.weather.com.cn/data/101010100.html"];
    NSURLRequest *requst = [NSURLRequest requestWithURL:url];

    //发送异步请求
    [NSURLConnection sendAsynchronousRequest:requst queue:[[NSOperationQueue alloc] init] completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) {

        if ([data length] > 0 && error == nil){
            //将NSData转换成NSDictionary
            NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableLeaves error:nil];
            //结果为字典中有字典,获得key为weatherinfo的字典
            NSDictionary *dic2 = [dic objectForKey:@"weatherinfo"];
            //遍历字典
            for (NSString *key in dic2) {
                NSLog(@"%@:%@", key, [dic2 objectForKey:key]);
            }
        }
    }];
}

  

XML解析可以通过苹果自带的API -> NSXMLParser和其代理类NSXMLParserDelegate。

NSXMLParseDelegate代理类中有一组方法用来检测文档的读取状态,例如,文档开始、文档结束、元素开始、元素结束、内容开始等;

解析XML数据的基本思路是,在元素开始时创建一个空对象,找到内容时,读取内容并为对象的属性赋值,元素结束时将对象添加到集合中。

示例代码:

//创建一个Customer类
@interface Customer : NSObject

@property (nonatomic, assign) int cid;  //客户id
@property (nonatomic, retain) NSString *name;//客户姓名
@property (nonatomic, assign) int age;  //客户年龄

@end

  

//先定义4个属性
@property (nonatomic, retain) Customer *customer;   //客户实例
@property (nonatomic, retain) NSXMLParser *parser;  //xml解析器
@property (nonatomic, retain) NSMutableArray *array;    //可变数组
@property (nonatomic, strong) NSString *currrentElement;    //当前元素

//初始化方法
- (void)initParser{
   //初始化数组,用来容纳客户对象
    self.array = [NSMutableArray arrayWithCapacity:10];
    //获得客户XML文件的URL路径
    NSString *str = [[NSBundle mainBundle] pathForResource:@"customers" ofType:@"xml"];
    //将客户XML转换成NSData
    NSData *data = [[NSData alloc] initWithContentsOfFile:str];
    //实例化XML解析器
    self.parser = [[NSXMLParser alloc] initWithData:data];
    //设置代理
    self.parser.delegate = self;
}

/**
 *  实现协议代理方法
 */
//读文档开始
- (void)parserDidStartDocument:(NSXMLParser *)parser{
    NSLog(@"parserDidStartDocument...");
}

//读文档结束
- (void)parserDidEndDocument:(NSXMLParser *)parser{
    NSLog(@"parserDidEndDocument....");
}

//读元素开始
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict{
    NSLog(@"didStartElement...");
    self.currrentElement = elementName;
    if ([self.currrentElement isEqualToString:@"customer"]){
        self.customer = [[Customer alloc] init];
    }
}

//找到内容
- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string{
    NSLog(@"foundCharacters....");

    if ([self.currrentElement isEqualToString:@"id"]){
        int cid = [string integerValue];
        [self.customer setCid:cid];
    }
    else if ([self.currrentElement isEqualToString:@"name"]){
        [self.customer setName:string];
    }
    else if ([self.currrentElement isEqualToString:@"age"]){
        [self.customer setAge:[string integerValue]];
    }
}

//读元素结束
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName{
    NSLog(@"didEndElement...");

    if ([elementName isEqualToString:@"customer"]){
        [self.array addObject:self.customer];
    }
    self.currrentElement = nil;
}

//开始解析方法
- (void)parse:(id)sender{
    //删除数组中的所有数据
    [self.array removeAllObjects];
    //开始解析
    [self.parser parse];
    //获得数组大小
    NSInteger count = [self.array count];
}

  

 

时间: 2024-10-25 19:12:53

ios网络编程学习的相关文章

iOS网络编程(三) 异步加载及缓存图片---->SDWebImage

@SDWebImage提供一个UIImageView的类别以支持加载来自网络的远程图片.具有缓存管理.异步下载.同一个URL下载次数控制和优化等特征. @SDWebImage的导入1.https://github.com/rs/SDWebImage 下载SDWebImage开源包2.将类包拖入工程,再导入MapKit.framework.ImageIO.framework两个框架3.SDWebImage是支持ARC的,在MRC的工程中要注意,可参考MRC工程配置ARC4.注意:SDWebImag

iOS网络编程开发—网络编程基础

iOS网络编程开发—网络编程基础 一.网络编程 1.简单说明 在移动互联网时代,移动应用的特征有: (1)几乎所有应用都需要用到网络,比如QQ.微博.网易新闻.优酷.百度地图 (2)只有通过网络跟外界进行数据交互.数据更新,应用才能保持新鲜.活力 (3)如果没有了网络,也就缺少了数据变化,无论外观多么华丽,终将变成一潭死水 移动网络应用 = 良好的UI + 良好的用户体验 + 实时更新的数据 新闻:网易新闻.新浪新闻.搜狐新闻.腾讯新闻 视频:优酷.百度视频.搜狐视频.爱奇艺视频 音乐:QQ音乐

网络编程学习小结

几种网络编程方式: ISAPI.CGI.WinInet.Winsock 它们之间的差别: 1)  ISAPI主要是开发基于浏览器client与server端程序.效率比CGI方式高,并且也扩展了CGI没有的一些功能.(基于TCP/IP模型中的应用层) 2)  CGI主要是开发基于浏览器client与server端程序.(基于TCP/IP模型中的应用层) 3)  WinInet主要是开发client程序.(基于TCP/IP模型中的应用层) 4)  Winsock主要是基于socket来开发clie

Windows平台VC++ 6.0 下的网络编程学习 - 简单的测试winsock.h头文件

最近学习数据结构和算法学得有点累了(貌似也没那么累...)...找了本网络编程翻了翻当做打一个小基础吧,打算一边继续学习数据结构一边也看看网络编程相关的... 简单的第一次尝试,就大致梳理一下看书+自己理解的东西. 1.首先是对Winsock的一点介绍:Winsock是一种标准的API(应用程序编程接口),主要用于网络中的数据通信,它允许两个应用程序在同一台机器上或通过网络相互通信.需要注意的是Winsock和协议无关,使用Winsock编程接口,应用程序可通过普通网络协议如:TCP/IP(网络

iOS网络编程笔记——Socket编程

一.什么是Socket通信: Socket是网络上的两个程序,通过一个双向的通信连接,实现数据的交换.这个双向连路的一端称为socket.socket通常用来实现客户方和服务方的连接.socket是TCP/IP协议的一个十分流行的编程接口.一个socket由一个IP地址和一个端口号唯一确定.TCP/IP协议的传输层又有两种协议:TCP(传输控制协议)和UDP(用户数据报协议).TCP是基于连接的,而UDP是无连接的:TCP对系统资源的要求较多,而UDP少:TCP保证数据的正确性而UDP可能丢包:

C#网络编程学习_01

参考http://blog.csdn.net/yuzhongchun/article/details/11990571 using System.Net; namespace Network_01 { public partial class Main : Form { public Main() { InitializeComponent(); } private void btnGetHostName_Click(object sender, EventArgs e) { DebugInfo

linux网络编程学习笔记之二 -----错误异常处理和各种碎碎(更新中)

errno 在unix系统中对大部分系统调用非正常返回时,通常返回值为-1,并设置全局变量errno(errno.h),如socket(), bind(), accept(), listen().erron存放一个正整数来保存上次出错的错误值. 对线程而言,每个线程都有专用的errno变量,不必考虑同步问题. strerror converts to English (Note: use strerror_r for thread safety) perror is simplified str

iOS网络编程(六) NSURLSession详解

昨夜浏览Demo的时候,看到别人请求网络数据用的是NSURLSession,当时就在想这里什么,怎么没有用过,引起了我的好奇心,遂去百度-谷歌-官方文档一一查看,有了一定的了解,原来NSURLSession是iOS7中新的网络接口,它与咱们熟悉的NSURLConnection是并列的. 查找资料,写了一个小Demo,大家可以看看,有什么不足的地方,可以留言帮我指出来. // // HMTRootViewController.m // // // Created by HMT on 14-6-7.

黑马程序员_JAVA UDP网络编程学习笔记

一.UDP网络编程概述 采用TCP协议通信时,客户端的Socket必须先与服务器建立连接,连接建立成功后,服务器端也会持有客户端连接的Socket,客户端的Socket与服务器端的Socket是对应的,它们构成了两个端点之间的虚拟通信链路.与TCP通信不同,UDP是面向无连接的.不可靠的基于数据包的传输协议.即应用进程(或程序)在使用UDP协议之前,不必先建立连接.自然,发送数据结束时也没有连接需要释放.因此,减少了开销和发送数据之前的延时.UDP也采用端口来区分进程. 在java中,java.