QF——网络之网络请求

NSURLConnection:

  这是自带的网络请求类。它的思路是建立连接的同时设置自己为自己的代理,然后就实现协议的几个方法(didReceiveResponse,didReceiveData,connectionDidFinishLoading,didFailWithError)。其中didReceiveData可能会被调用多次,因为当服务器传过来的数据很大时,它会分段传,每次传一点。所以我们得用可变NSMutableData来存储接收的数据。当所有数据接收完成后,connectionDidFinishLoading方法会被自动调用,在该方法里我们可以完成解析json数据的动作(服务器传过来的数据是json格式的)。

同步请求和异步请求:

  同步请求会阻塞主线程;

  异步请求不会阻塞主线程。

//
//  ViewController.m
//  JSONTest
//
//  Created by mac on 15-3-30.
//  Copyright (c) 2015年 ___FULLUSERNAME___. All rights reserved.
//

#import "ViewController.h"
#import "App.h"
#import "UIImageView+WebCache.h"
#define kSearchUrl @"https://api.douban.com/v2/book/search?q=s"

@interface ViewController ()<UITableViewDataSource,UITableViewDelegate,NSURLConnectionDataDelegate,NSURLConnectionDelegate>
{
    NSMutableArray * appArr;
    NSMutableData * downloadData;

    UITableView * tabView;
}

@end

@implementation ViewController
- (void)viewDidLoad
{
    [super viewDidLoad];

    downloadData = [NSMutableData data];
    appArr = [NSMutableArray array];

    //新建tableView
    [self createTableView];

    //建立异步请求
    [self makeConnection];

}

- (void)createTableView
{
    tabView = [[UITableView alloc]initWithFrame:CGRectMake(0, 0, 320, 480) style:UITableViewStyleGrouped];
    tabView.delegate = self;
    tabView.dataSource = self;
    tabView.rowHeight = 80;
    [self.view addSubview:tabView];

//    [tabView registerClass:[UITableViewCell class] forCellReuseIdentifier:@"cell"];

}

- (void)makeConnection
{
    [NSURLConnection connectionWithRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:kSearchUrl]] delegate:self];

}

- (void)decodeJson:(NSMutableData *)data
{
    NSError * error;
    NSDictionary * jsonDict = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:&error];
    NSArray * jsonArr = jsonDict[@"books"];
    for(NSDictionary * dict1 in jsonArr)
    {
        NSString * large = dict1[@"images"][@"large"];
        NSString * title = dict1[@"title"];
        NSString * author = dict1[@"author"][0];

        App * app = [[App alloc]init];
        app.large = large;
        app.title = title;
        app.author = author;

        [appArr addObject:app];
    }

    NSLog(@"%d",appArr.count);

}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    return appArr.count;
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell * cell = [tableView dequeueReusableCellWithIdentifier:@"cell"];
    if(cell==nil)
    {
        cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:@"cell"];

        if(appArr.count>0)
        {
            App * app = appArr[indexPath.row];
            cell.textLabel.text = app.title;
            cell.detailTextLabel.text = app.author;
            [cell.imageView sd_setImageWithURL:[NSURL URLWithString:app.large] placeholderImage:[UIImage imageNamed:@"photo"]];
        }
    }

    return cell;
}

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
{
    downloadData.length = 0;
}

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{
    [downloadData appendData:data];
}
- (void)connectionDidFinishLoading:(NSURLConnection *)connection
{
    //解析json数据
    [self decodeJson:downloadData];
    [tabView reloadData];

}
- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error
{
    NSLog(@"%@",error);
}

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
}

@end

第三方网络请求框架AFHTTPRequestOperationManager:

  先一个请求管理类,然后调用下面一个方法就行了,它里面只需要两个参数url和param,然后有两个请求成功和失败的回调方法(block)。success的block返回值responseObject就是服务器传过来的完整数据。

  可以在success的block里完成数据解析。

    AFHTTPRequestOperationManager * manager = [AFHTTPRequestOperationManager manager];
    [manager GET:kSearchUrl parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) {
        NSLog(@"请求成功");
        //responseObject就是传过来的数据,而且是一次性完整的数据。可以在这里完成数据解析工作
    } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
        NSLog(@"请求失败");
    }];
时间: 2024-11-09 06:18:57

QF——网络之网络请求的相关文章

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

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

Socket网络编程--网络爬虫(1)

我们这个系列准备讲一下--网络爬虫.网络爬虫是搜索引擎系统中十分重要的组成部分,它负责从互联网中搜集网页,采集信息,这些网页信息用于建立索引从而为搜索引擎提供支持,它决定着整个引擎系统的内容是否丰富,信息是否即时,因此其性能的优劣直接影响着搜索引擎的效果.网络爬虫的基本工作原理: (1)从一个初始URL集合中挑选一个URL,下载该URL对应的页面: (2)解析该页面,从该页面中抽取出其包含的URL集合,接下来将抽取的URL集合再添加到初始URL集合中: (3)重复前两个过程,直到爬虫达到某种停止

Linux网络编程------网络编程基础

Socket(套接字),类似文件描述符,三种 1.流式套接字(SOCK_STREAM):可以提供可靠的.面向连接的通讯流,它使用TCP协议.TCP保证了数据传输的正确性和顺序性. 2.数据报套接字(SOCK_DGRAM):定义了一种无连接的服务,数据通过相互独立的报文进行传输,是无序的,并且不保证可靠,无差错,它使用数据报协议(UDP). 3.原始套接字(SOCK_RAW):直接基于IP协议. 网络地址 struct sockaddr用于记录网络地址: struct sockaddr { u_s

[转] - Linux网络编程 -- 网络知识介绍

(一)Linux网络编程--网络知识介绍 Linux网络编程--网络知识介绍客户端和服务端         网络程序和普通的程序有一个最大的区别是网络程序是由两个部分组成的--客户端和服务器端. 客户端        在网络程序中,如果一个程序主动和外面的程序通信,那么我们把这个程序称为客户端程序. 比如我们使用ftp程序从另外一        个地方获取文件的时候,是我们的ftp程序主动同外面进行通信(获取文件), 所以这个地方我们的ftp程序就是客户端程序. 服务端        和客户端相

网络爬虫(网络蜘蛛)之网页抓取

现在有越来越多的人热衷于做网络爬虫(网络蜘蛛),也有越来越多的地方需要网络爬虫,比如搜索引擎.资讯采集.舆情监测等等,诸如此类.网络爬虫涉及到的技术(算法/策略)广而复杂,如网页获取.网页跟踪.网页分析.网页搜索.网页评级和结构/非结构化数据抽取以及后期更细粒度的数据挖掘等方方面面,对于新手来说,不是一朝一夕便能完全掌握且熟练应用的,对于作者来说,更无法在一篇文章内就将其说清楚.因此在本篇文章中,我们仅将视线聚焦在网络爬虫的最基础技术--网页抓取方面. 说到网页抓取,往往有两个点是不得不说的,首

伪基站,卒于5G——本质上是基于网络和UE辅助的伪基站检测,就是将相邻基站的CI、信号强度等信息通过测量报告上报给网络,网络结合网络拓扑、配置信息等相关数据,对所有数据进行综合分析,确认在某个区域中是否存在伪基站

伪基站,卒于5G from:https://www.huxiu.com/article/251252.html?h_s=h8 2018-07-05 21:58收藏27评论6社交通讯 本文来自微信公众号:网优雇佣军(hr_opt),虎嗅获授权发表,题图来自:pixabay.com. 伪基站是2G时代的产物,通过伪装运营商的基站,向用户手机发送广告推销.诈骗.钓鱼网站等信息,侵犯公民隐私,危害人身财产安全,扰乱社会秩序. 2G时代,由于GSM只有单向鉴权加密,手机无法确认网络的合法性,导致伪基站有机

python 网络篇(网络编程)

一.楔子 你现在已经学会了写python代码,假如你写了两个python文件a.py和b.py,分别去运行,你就会发现,这两个python的文件分别运行的很好.但是如果这两个程序之间想要传递一个数据,你要怎么做呢? 这个问题以你现在的知识就可以解决了,我们可以创建一个文件,把a.py想要传递的内容写到文件中,然后b.py从这个文件中读取内容就可以了. 但是当你的a.py和b.py分别在不同电脑上的时候,你要怎么办呢? 类似的机制有计算机网盘,qq等等.我们可以在我们的电脑上和别人聊天,可以在自己

网络编程—网络基础概览、socket,TCP/UDP协议

网络基础概览 socket概览 socket模块-TCP/UDP的实现 TCP/UDP总结 网络基础概览 osi七层协议各层主要的协议 # 物理层传输电信号1010101010 # 数据链路层,以太网协议,arp协议.对这些信号进行分组,同时规范了分组形式--以太网协议,头部是mac地址中间是信息, # 网络层:ip协议,arp协议帮忙找到mac地址,ip,子网掩码,网关(下面有一些简单概括) # 传输层:tcp协议,udp协议 # (socket)就是一组接口,将复杂的tcp协议和udp协议隐

Linux网络——配置网络之ifconfig家族命令

Linux网络——配置网络之ifconfig家族命令 摘要:本文主要学习了ifconfig家族用来配置网络的命令. ifconfig命令 ifconfig命令用来显示或设置网络接口信息,设置只是临时生效,永久生效需要更改配置文件. 在最新版的CentOS 7上已经没有了这个命令,需要使用 yum install -y net-tools 命令安装. 基本语法 1 ifconfig [选项] 选项说明 1 网卡:显示指定网卡接口信息. 2 -a:显示全部接口信息. 3 -s:显示摘要信息. 4 网

网络的网络——当今的互联网

? 由于因特网是由数以亿计的用户构成的,因此接入ISP本身必须互联,创建"网络的网络". 上图大概是2012年的网络.由十多个第一层ISP和数十万个较低层ISP组成.较低层的ISP与较高层的ISP相连,较高层ISP彼此相连.用户和内容提供商是较低层ISP的客户,较低层ISP是较高层ISP的客户.主要的内容提供商也已经创立了自己的网络,直接在可能的地方与较低层ISP互联. 第一层ISP (tier-1 ISP) 提供全球承载的功能,大约有十几个第一层全球ISP,如AT&T.NTT