iOS开发 - 第04篇 - 网络 - 01 - NSOperation & 网络基础

实现:Cell图片下载程序

源代码下载地址:点击打开链接

1、Cell图片下载程序

1.1 界面

1.2 基本思路

1> Storyboard中添加导航控制器,根控制器为UITableViewController

2> 新建HMAppsViewController,关联

3> 导入app.plist,新建HMApp,提供类方法,利用KVC,字典转模型

4>HMAPPViewController中懒加载模型数组

5> 实现ViewController数据源方法,设置Cell的textLabel和detailTextLabel,并测试

6> 图片下载问题

1.3 Cell图片下载思路 --- 重要

1> 若直接在设置Cell明细的代理方法(主线程)中,下载图片,设置每个Cell图片

注1:dataWithContentsOfURL:从网络上下载图片,耗时,而且放在主线程中,会造成主线程阻塞,导致拖动变卡(同时网速慢,在下载图片的同时不能拖动界面)

注2:设置Cell明细的代理方法,调用频率非常高(一滚动只要出现新的Cell就会调用),上下滚时会导致重复下载,浪费流量

2> 使用NSOperation作为下载线程,且系统会管理下载的线程数

3> 懒加载一个NSOperationQueue,用来存放所有下载操作的队列

注1:由于异步执行,很有可能图片还没有下载完,这个Cell就已经返回,还是会导致图片没有显示,来回滚动后可能会显示

注2:应保证图片下载完,设置了Cell以后再返回Cell

4> 首先解决重复下载问题

保证:1张图片只下载1次

即:每一个url对应的Operation只需要一个,一个Operation代表一个下载操作,一对一的对应关系,使用字典!!!

1. 懒加载一个NSMutableDictionary,用于存放所有的下载操作(url是key,Operation对象是value)

2. 在Cell明细方法中,首先判断对应key的Operation是否存在,若不存在则创建对应的Operation,开启下载线程,并将Operation添加到字典中

注:由于是异步执行,添加到队列后,又将Operation添加到字典中,此时用户如果又来回滚动的话,即使下载还没有完成,也不会再去创建新的Operation

5> 此时又会出现两个问题:

1. 存放操作的字典operations会越来越大

2. 如果下载失败,一旦出现一次,该图片就无法再重新下载,因为这个图片url对应的Operation一直存在字典中

解决办法:

1.
下载完后,将操作Operation从字典中移除

2.
此时又导致之前的问题,又会重新下载

3.
因此,再添加一个字典images(懒加载),存放已经下载完的UIImage,可以保证以后需要的时候直接从内存中取,不用再下载

4. Cell明细方法中,应该首先判断images字典中是否已经存在下载好的图片,若无,再去下载,同时再根据operations字典保证不要重复下载

5.
此时若下载失败,images字典中不存在对应的UIImage图片,而且对应的Operation已经移除,可以重新下载

注:字典不能放nil,因此万一图片下载失败

self.images[app.icon]= image;会导致程序崩溃

需加判断

if (image) {

self.images[app.icon]= image;

}

6> 缓存池可重用问题

注:0、1、2、3是已经下载完的图片,当用户向上拖动时,0被放入缓存池中,此时4进入界面,会从缓存池中加载可重用Cell-0,由于4还没有下载,若4来不及下载完成,不能及时设置Cell-4图片会造成:0的图片显示在4的位置!!!等到4的图片下载完成,再设置回4对应的图片

解决办法:

使用占位图片,在图片未下载完成的时候使用占位图片盖住,代表正在下载,下载完成后设置为相应图片,且下次会直接使用下载好的图片

7> 图片显示错乱问题

还是Cell的循环利用导致,原因如下:

一开始0对应的图片在下载中,用户拖动后,将0放到了缓存池中,4出现的时候,从缓存池中取出了0放到了4的位置,并发送请求下载4对应的图片,此时一开始0对应的图片刚好下载完成,会到主线程中设置0对应Cell的图片,此时由于Cell-0和Cell-4对应同一个地址,就会将0的图片设置到4的位置,造成显示错乱,等到4对应图片又下载完成后,再重新设置回4!

解决办法:不能直接设置Cell图片,应该重新刷新表格,此时又会调用Cell明细方法,而此时已经有对应的正确图片

此时,基本完成Cell图片下载,保证指下载一次,且以后每次都从缓存中取出图片来显示,拖动tableView也不会卡!

8> 添加内存警告处理

9> 添加开始滚动和滚动结束的队列处理

10> 抽取下载代码

11> 整体思路

12> block循环引用问题

注1:block会对里面的对象进行强引用

注2:此时由于block和self(HMAppsViewController)循环引用,都不能释放

解决办法:block内部使用弱指针

13> 整体代码

1.4 沙盒缓存

1> 将图片存入沙盒

2> 从沙盒中取出图片

2、自定义Operation

将操作中需要执行的操作封装到一个自定义Operation中,如上述Cell图片下载程序中的下载操作

注1:一旦将一个操作添加到队列当中,其实内部会调用这个操作的main方法

注2:下载完应该通知控制器去刷新表格,使用代理

3、SDWebImage --- 重要

以Cell图片下载程序为例:

1> #import"UIImageView+WebCache.h"

2> 在Cell明细方法中调用方法即可,实现上述图片下载所有操作

3> 其他常用用法

4>SDWebImage内存处理

注:SDWebImage通常属于整个项目,不属于某个控制器(很多控制器都需要使用这个框架),因此需要在整个项目(appDelegate)有内存警告的时候进行内存处理(#import "SDWebImageManager.h")

4、小结

注:SDWebImage缓存时长默认一周

5、网络基础

5.1 简单说明

在移动互联网时代,移动应用的特征有:几乎所有应用都需要用到网络,比如QQ、微博、网易新闻、优酷、百度地图;只有通过网络跟外界进行数据交互、数据更新,应用才能保持新鲜、活力;如果没有了网络,也就缺少了数据变化,无论外观多么华丽,终将变成一潭死水

移动网络应用 = 良好的UI + 良好的用户体验 + 实时更新的数据

新闻:网易新闻、新浪新闻、搜狐新闻、腾讯新闻

视频:优酷、百度视频、搜狐视频、爱奇艺视频

音乐:QQ音乐、百度音乐、酷狗音乐、酷我音乐

LBS:百度地图、高德地图、大众点评、墨迹天气、滴滴打车

电商:淘宝、京东商城、天猫、蘑菇街、凡客诚品、美丽说

社交:QQ、微信、微博、陌陌、比邻

为什么要学习网络编程

网络编程是一种实时更新应用数据的常用手段

网络编程是开发优秀网络应用的前提和基础

5.2 基本概念

在网络编程中,有几个必须掌握的基本概念

客户端(Client):移动应用(iOS、android等应用)

服务器(Server):为客户端提供服务、提供数据、提供资源的机器

请求(Request):客户端向服务器索取数据的一种行为

响应(Response):服务器对客户端的请求做出的反应,一般指返回数据给客户端

作为移动开发工程师,主要的精力都是放在前端开发

5.3 服务器

1> 服务器分类

2> 本地服务器选择

3> 搭建本地服务器

参考博客:点击打开链接

4> 本地服务器的主机地址

6、URL

注:URL中常见的协议

1> HTTP

超文本传输协议,访问的是远程的网络资源,格式是http://

http协议是在网络开发中最常用的协议

2> file

访问的是本地计算机上的资源,格式是file://(不用加主机地址)

3> mailto

访问的是电子邮件地址,格式是mailto:

4> FTP

访问的是共享主机的文件资源,格式是ftp://

7、HTTP协议

1> HTTP协议(全称是Hypertext Transfer Protocol,超文本传输协议)简介:不管是移动客户端还是PC端,访问远程的网络资源经常使用HTTP协议(访问百度主页:http://www.baidu.com)

2>HTTP协议特点

1. 简单快速  因为HTTP协议简单,所以HTTP服务器的程序规模小,因而通信速度很快

2. 灵活  HTTP允许传输任意类型的数据

3. HTTP 0.9和1.0使用非持续连接,限制每次连接只处理一个请求,服务器对客户端的请求做出响应后,马上断开连接,这种方式可以节省传输时间

3> HTTP的通信过程

要想使用HTTP协议向服务器索取数据,得先了解HTTP通信的完整过程,完整的http通信可以分为2大步骤

1. 请求:客户端向服务器索要数据

2. 响应:服务器返回客户端相应的数据

4> iOS中发送HTTP请求的方案

8、NSURLConnection

9、模拟登录界面

时间: 2024-10-12 16:49:30

iOS开发 - 第04篇 - 网络 - 01 - NSOperation & 网络基础的相关文章

iOS开发 - 第05篇 - 项目 - 01 - 搭建框架

实现:仿新浪微博 1.项目配置 1> 取消横竖屏 2> 设置图标和启动图片 3> 删除MainStoryboard,全部代码创建 2.添加TabBarController 2.1 创建窗口 1>在didFinishLaunchingWithOptions方法中,创建窗口,设置根控制器,显示窗口 2> 添加TabBarController的子控制器 3>抽取重复代码 注:上述方法限制每次创建的都是UIViewController,实际使用中,需要设置不同的控制器作为Tab

iOS开发——实战OC篇&环境搭建之Xib(玩转UINavigationController与UITabBarController)

iOS开发——实战OC篇&环境搭建之Xib(玩转UINavigationController与UITabBarController) 前面我们介绍了StoryBoard这个新技术,和纯技术编程的代码创建界面,本篇我们将介绍一个老的技术,但是在很多的公司或者库里面还是使用这个技术,既然如此它肯定有他的好处,至于好处这里我就不一一介绍了.在Xcode5之前是只能使用Xib或者代码的,而代码又对于很多初学者来说算是一个难题.毕竟不知道怎么下手.所以我就总结了一下这段时间自己编写程序的一个实例来说明怎么

iOS开发——实战OC篇&环境搭建之纯代码(玩转UINavigationController与UITabBarController)

iOS开发——实战OC篇&环境搭建之纯代码(玩转UINavigationController与UITabBarController) 这里我们就直接上实例: 一:新建一个项目singleView Controller,命名未iCocos 二:由于我们使用的纯代码实现的,所以删除其中的StoryBoard和Viewtroller的两个文件 三:新建一个继承自TabBar Controller的类,我们命名问iCocos ViewController 三:在Appdelegate的实现文件中导入刚刚

iOS开发项目—04添加导航栏的按钮

iOS开发项目—04添加导航栏的按钮 一.设置导航栏的按钮 要求实现的效果:             说明:默认状态下和高亮状态下的图片是不一样的. 按钮的图片需要设置默认状态和高亮状态时的显示,系统了提供的下面方法 viewController.navigationItem.leftBarButtonItem=[UIBarButtonItem alloc]initWithImage:<#(UIImage *)#> style:<#(UIBarButtonItemStyle)#>

IOS开发数据存储篇—IOS中的几种数据存储方式

IOS开发数据存储篇—IOS中的几种数据存储方式 发表于2016/4/5 21:02:09  421人阅读 分类: 数据存储 在项目开发当中,我们经常会对一些数据进行本地缓存处理.离线缓存的数据一般都保存在APP所在的沙盒之中.一般有以下几种: 1.PList(XML属性列表) 在使用plist进行数据存储和读取,只适用于系统自带的一些常用类型才能用,且必须先获取路径相对麻烦 //写入文件 NSString *doc = [NSSearchPathForDirectoriesInDomains(

iOS开发——多线程OC篇&amp;多线程详解

多线程详解 前面介绍了多线程的各种方式及其使用,这里补一点关于多线程的概念及相关技巧与使用,相信前面不懂的地方看了这里之后你就对多线程基本上没有什么问题了! 1——首先ios开发多线程中必须了解的概念: 进程 正在进行中的程序被称为进程,负责程序运行的内存分配 每一个进程都有自己独立的虚拟内存空间 线程 线程是进程中一个独立的执行路径(控制单元) 一个进程中至少包含一条线程,即主线程 可以将耗时的执行路径(如:网络请求)放在其他线程中执行 创建线程的目的就是为了开启一条新的执行路径,运行指定的代

iOS开发——实用技术OC篇&amp;多线程整合

多线程整合 本文知识对iOS开发中多线程的一些知识整合,关于一些概念和技术问题并没有过多的介绍,如果你想了解更多请查看笔者之前写的iOS开发之多线程详解(比较完整):但是有部分涉及到之前文章中没有的技术点和常识,比如加锁的方式,面试相关的,还有一些关于GCD的高级用法,希望你能认真看完,或许可以收获到很多! http://www.cnblogs.com/iCocos/p/4553103.html http://www.cnblogs.com/iCocos/p/4553262.html ??先来看

iOS开发笔记4:HTTP网络通信及网络编程

这一篇主要总结iOS开发中进行HTTP通信及数据上传下载用到的方法.网络编程中常用的有第三方类库AFNetworking或者iOS7开始新推出的NSURLSession,还有NSURLSession的前任NSURLConnection.一般情况下,使用AFNetworking即可满足绝大多数要求,并且更简洁高效. 1.HTTP协议之POST与GET 访问网络数据大部分都要用到HTTP协议,通过HTTP协议向服务器请求数据,再通过HTTP协议获得服务器的响应数据,常见的操作主要是POST与GET,

IOS开发--数据持久化篇文件存储(二)

前言:个人觉得开发人员最大的悲哀莫过于懂得使用却不明白其中的原理.在代码之前我觉得还是有必要简单阐述下相关的一些知识点. 因为文章或深或浅总有适合的人群.若有朋友发现了其中不正确的观点还望多多指出,不胜感激. 承接上篇博客我们来看看IOS开发中是如何将一个自定义的对象进行归档的 本篇博客将介绍以下几个方面的内容 1)普通的单个对象归档操作 2)拥有继承关系的对象归档 3)同时将多个对象进行归档 1.普通的单个对象归档操作 首先我们来看下最简单的单个对象归档操作 1.自定义一个跟小明一样有名的类(