同步请求和异步请求:

  同步请求会阻塞主线程;不会开启新的线程,还是主线程,所以直到请求成功后,才能执行其它操作。

  异步请求不会阻塞主线程。开启新的线程去请求服务器,而不影响用户的交互操作等其他动作。

使用NSURLConnection发送同步请求和异步请求:

同步请求:

异步请求:(block回调方式)——请求的数据通过block返回

异步请求:(delegate方式)——请求的数据在重写的代理方法里返回

 需要注意的是:

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
didReceiveData的参数data是从服务器返回的二进制数据,所以我们使用NSMutableData类型来接收。因此,json解析的核心就是把从网络而来的二进制数据(NSData)转换为json对象。然后从json结构获取有意义的数据。
NSDictionary * jsonDict = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:&error];

补充:网络请求返回的数据一般都是二进制数据(NSData),但若请求是纯文档,则也可以使用NSString接收。

//
// 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(, , , ) style:UITableViewStyleGrouped];
tabView.delegate = self;
tabView.dataSource = self;
tabView.rowHeight = ;
[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"][]; 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>)
{
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 = ;
} - (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

使用第三方网络请求框架AFNetworking:

  先实例化出一个manager对象,对网络的GET和POST请求都是通过它的方法完成的。

  success的block返回值responseObject就是服务器传过来的完整数据。返回的数据类型默认是json格式的。它的强大不仅在于高度封装了对网络的请求,而且可以根据不同情形设置请求数据和返回数据的格式。它默认的请求数据类型为二进制的,默认的返回数据类型为json。若请求的服务器是json文档,则返回的直接就是json数据,直接获取有意义的数据就行;若请求的服务器是xml文档,则先要使其返回数据类型为xml格式的。

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

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

补充:

manager 的POST请求有两个方法,上面是下载,还有一个用于上传。

参数formData就是要上传的数据。

图片缓存问题:(性能优化)

  上面的代码用到了一个非常优秀的第三方框架SDWebImage。它会自动实现异步加载,图片缓存,控制同一URL加载次数(同一个url不会重复请求)。

  [cell.imageView sd_setImageWithURL:[NSURL URLWithString:app.large] placeholderImage:[UIImage imageNamed:@"photo"]];

该句就是核心代码,它自动会帮我们实现图片缓存。而且在第一次去服务器加载图片还没获取到时,是用占位图片的(placeholderImage),等从服务器加载到了图片后就被替换掉了

  设想,要是在加载图片的时候我们不使用SDWebImage框架,那连我们滑动tableView时,只要滑出现一次就会去服务器加载一次,这无疑是很糟糕的,太费流量和时间了。此时我们的策略是使用图片缓存,首先判断有没有缓存,若有缓存,则用缓存的图片;若无缓存,才去服务器加载。缓存则分为内存缓存和本地缓存。内存缓存是不理想的,因为它比较占用内存,影响APP运行速度。其次内存缓存只存在于APP一个运行周期里,当关闭APP时,内存缓存会清空,下次打开APP时,又得去服务器加载图片。面对这样的问题,我们通常都采用本地缓存,也就是第一次从服务器把图片加载后,写入本地文件,那以后再次打开时,只要读取本地文件的图片就可以了,这样减少了请求服务器的次数,既降低了流量的消耗,又提升了性能。

QF——网络之网络请求的几种方式,图片缓存的更多相关文章

  1. 第二节:SSL证书的申请、配置(IIS通用)及跳转Https请求的两种方式

    一. 相关概念介绍 1. SSL证书服务 SSL证书服务由"服务商"联合多家国内外数字证书管理和颁发的权威机构.在xx云平台上直接提供的服务器数字证书.您可以在阿里云.腾讯云等平台 ...

  2. C#中Post请求的两种方式发送参数链和Body的

    POST请求 有两种方式 一种是组装key=value这种参数对的方式 一种是直接把一个字符串发送过去 作为body的方式 我们在postman中可以看到 sfdsafd sdfsdfds publi ...

  3. Spring MVC中forward请求转发2种方式(带参数)

    Spring MVC中forward请求转发2种方式(带参数) http://www.51gjie.com/javaweb/956.html  

  4. 解决 SharePoint 2010 拒绝访问爬网内容源错误的小技巧(禁用环回请求的两种方式)

    这里有一条解决在SharePoint 2010搜索爬网时遇到的“拒绝访问错误”的小技巧. 首先要检查默认内容访问帐户是否具有相应的访问权限,或者添加一条相应的爬网规则.如果目标资源库是一个ShareP ...

  5. nginx分发请求的2种方式:1、指明server_name;2、通过location过滤uri来分发请求;

    user nginx; worker_processes 8; # = cpu num; error_log /data/nginx/log/error/error.log warn; # warn, ...

  6. iOS 通过URL网络获取XML数据的两种方式

    转载于:http://blog.csdn.net/crayondeng/article/details/8738768 下面简单介绍如何通过url获取xml的两种方式. 第一种方式相对简单,使用NSD ...

  7. WebAPI GET和POST请求的几种方式

    GET请求 1.无参数get请求 一般get请求有两种写法,一种是$.get()   一种是$.ajax({type:"get"}),我个人比较喜欢用后者. 下面例子主要是get无 ...

  8. springmvc 前端 发ajax请求的几种方式

    一.传json单值或对象 1.前端 var data = {'id':id,'name':name}; $.ajax({ type:"POST", url:"user/s ...

  9. java发送http get请求的两种方式

    长话短说,废话不说 一.第一种方式,通过HttpClient方式,代码如下: public static String httpGet(String url, String charset) thro ...

随机推荐

  1. 模块化的JavaScript

    我们再一次被计算机的名词,概念笼罩. backbone.emberjs.spinejs.batmanjs 等MVC框架侵袭而来. CommonJS.AMD.NodeJS.RequireJS.SeaJS ...

  2. css3文本效果

    CSS3 包含多个新的文本特性. 在本章中,您将学到如下文本属性: 1. text-shadow 2. word-wrap 浏览器支持 Internet Explorer 10.Firefox.Chr ...

  3. 查看Android系统当前运行的activity

    在Appium进行自动化测试的时候,往往需要知道你要测试的应用的包名和activity的名字,这样才可以进行自动化测试. 在我之前的博客中也提到了获取activity的名字,但是并不是很方便,甚至浪费 ...

  4. iOS下的实际网络连接状态检测(转)

    序言 网络连接状态检测对于我们的iOS app开发来说是一个非常通用的需求.为了更好的用户体验,我们会在无网络时展现本地或者缓存的内容,并对用户进行合适的提示.对绝大部分iOS开发者来说,从苹果示例代 ...

  5. C++<algorithm>中sort的比较函数写法(转)

    转自:http://www.wl566.com/biancheng/98907.html C++<algorithm>中sort的比较函数写法,有需要的朋友可以参考下. 定义排序函数: 方 ...

  6. *++p和*p++的区别

    *p++:先是用*p这个值,然后再使p的地址加1. #include<iostream>using namespace std;int main(){    char s[81]=&quo ...

  7. Javascript 链式运动框架——逐行分析代码,让你轻松了解运动的原理

    所谓链式运动,就是一环扣一环.我们的很多运动实际上来说指的就是分阶段的,第一个阶段动完,下个阶段开始动. 这个链式运动框架就是用来处理这些问题的. 我们先来看下之前的运动框架,以下是Javascrip ...

  8. 前端开发面试题收集 css

    什么是CSS盒子模型 页面上的每个元素都被浏览器看做是一个矩形的盒子. 由内容.填充.边框.边界组成. 什么是 css sprite 将多个图片拼接在一个图片中,通过background-positi ...

  9. [原创]NT系统信息察看工具 : NtInfoGuy

    原文链接:[原创]NT系统信息察看工具 : NtInfoGuy 对于windows的内部,我们有太多的东西需要了解,认知.我们非凡的.从不知足的探求本性驱使我们要 拨开迷雾得见青天.太多的木马,病毒, ...

  10. WIFI无线adb调试android

    有个需求需要支持android插上键盘,鼠标等外设,但是这样就不能使用microusb口进行adb调试了. 研究了一番,发现可以利用wifi进行adb无线调试(adb应该本身已经支持无线调试). WI ...