iOS如何获取网络图片(三)有沙盒的
沙盒
沙盒简介
- 默认情况下,每个沙盒含有3个文件夹:Documents, Library 和 tmp。因为应用的沙盒机制,应用只能在几个目录下读写文件
Documents:苹果建议将程序中建立的或在程序中浏览到的文件数据保存在该目录下,iTunes备份和恢复的时候会包括此目录,如果保存了下载的数据,程序提交会被直接被拒绝
Library:存储程序的默认设置或其它状态信息;
Library/Caches:存放缓存文件,iTunes不会备份此目录,此目录下文件不会在应用退出删除
Library/Preferences:偏好设置文件
tmp:提供一个即时创建临时文件的地方,在iPhone在重启时,会丢弃所有的tmp文件。
获取沙盒目录
//在模拟器上,沙盒目录是变化的,所以每次都要打印
// NSString * path = NSHomeDirectory();NSArray * array = @[@1,@2,@3,@4,@5];
//获取沙盒目录的方法
NSString * path = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject];//追加文件名
path = [path stringByAppendingPathComponent:@"data.plist"];[array writeToFile:path atomically:YES];
NSLog(@"%@",path);
系统偏好设置代码
//偏好设置,用户信息,是否推送,是否支持3G.
NSUserDefaults * ud = [NSUserDefaults standardUserDefaults];
//存储偏好数据
// [ud setObject:@"11" forKey:@"age"];
//
// [ud setInteger:20 forKey:@"weight"];
//
// // setObject + synchronize
// //马上存入本地
// [ud synchronize];
//从本地获取
// NSLog(@"%@", [ud objectForKey:@"username"]);
[ud removeObjectForKey:@"age"];
有沙盒的网络请求
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
SXTShopCell * cell = [tableView dequeueReusableCellWithIdentifier:identifier];
SXTShop * shop = self.dataList[indexPath.row];
cell.shop = shop;
//为了避免重复加载的问题,创建了downloadImage,downloadImage属于数据源,当tableview滚动的时候就可以给cell的数据赋值
//从图片缓冲池里找到对应的图片
if ([self.imageCache objectForKey:shop.shop_image]) {
//如果下载过,直接从内存中获取图片
// cell.iconView.image = shop.downloadImage;
cell.iconView.image = self.imageCache[shop.shop_image];
} else {
//从本地获取缓存图片
UIImage * image = [UIImage imageWithContentsOfFile:[self cacheWithPathUrl:shop.shop_image]];
//如果本地存在
if (image) {
//将本地图片放入内存中
[self.imageCache setObject:image forKey:shop.shop_image];
cell.iconView.image = image;
} else {
//设置默认图片
cell.iconView.image = [UIImage imageNamed:@"defaultImage"];
[self downloadImage:indexPath];
}
}
return cell;
}
- (void)downloadImage:(NSIndexPath *)indexPath {
SXTShop * shop = self.dataList[indexPath.row];
if ([self.operationDict objectForKey:shop.shop_image]) {
NSLog(@"已经请求过了,请等待下载");
} else {
//如果未下载过,开启异步线程
NSBlockOperation * op = [NSBlockOperation blockOperationWithBlock:^{
//模拟网络延时
[NSThread sleepForTimeInterval:1];
//通过url获取网络数据
NSData * data = [NSData dataWithContentsOfURL:[NSURL URLWithString:[NSString stringWithFormat:@"%@%@",baseUrl,shop.shop_image]]];
//将数据装换为图片
UIImage * image = [UIImage imageWithData:data];
//如果有图片
if (image) {
//通知model,将图片赋值给downloadImage,以便下次从内存获取
// shop.downloadImage = image;
//将图片作为value,将url作为key
[self.imageCache setObject:image forKey:shop.shop_image];
//将网络获取的图片存入沙盒
[data writeToFile:[self cacheWithPathUrl:shop.shop_image] atomically:YES];
//获取主队列,更新UI
[[NSOperationQueue mainQueue] addOperationWithBlock:^{
//刷新第indexPath单元的表格
[self.tableView reloadRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationNone];
}];
}
}];
//将请求加入操作缓冲池中
[self.operationDict setObject:op forKey:shop.shop_image];
//将请求加入全局队列
[self.queue addOperation:op];
}
}
- (NSString *)cacheWithPathUrl:(NSString *)netUrl {
//获取沙盒路径
NSString * path = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject];
//获取url的最后一项路径和path拼接
path = [path stringByAppendingPathComponent:[netUrl lastPathComponent]];
return path;
}
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
[self.view addSubview:self.tableView];
}
//当内存发生警报时,调用
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
[self.imageCache removeAllObjects];
[self.operationDict removeAllObjects];
[self.queue cancelAllOperations];
}
iOS如何获取网络图片(三)有沙盒的的更多相关文章
- iOS如何获取网络图片(二)
ios如何获取图片(二)无沙盒下 解决问题 *解决问题1:tableView滑动卡顿,图片延时加载 解决方法:添加异步请求,在子线程里请求网络,在主线程刷新UI *解决问题2:反复请求网络图片,增加用 ...
- iOS开发——多线程篇——快速生成沙盒目录的路径,多图片下载的原理、SDWebImage框架的简单介绍
一.快速生成沙盒目录的路径 沙盒目录的各个文件夹功能 - Documents - 需要保存由"应用程序本身"产生的文件或者数据,例如:游戏进度.涂鸦软件的绘图 - 目录中的文件会被 ...
- IOS开发-UI学习-沙盒机制&文件操作
苹果为软件的运行提供了一个沙盒机制 每个沙盒含有3个文件夹:Documents, Library 和 tmp.因为应用的沙盒机制,应用只能在几个目录下读写文件 Documents:苹果建议将程序中 ...
- 将UIImage保存到iOS照片库和对应程序沙盒中-b
1.保存到iOS照片库需要引入QuartzCore.framework框架,具体代码如下:.h文件#import <QuartzCore/QuartzCore.h>UIImageView ...
- iOS如何获取网络图片(一)
static NSString * baseUrl = @"http://192.168.1.123/images/"; - (UITableViewCell *)tableVie ...
- iOS之沙盒机制和如何获取沙盒路径
iOS APP可以在自己的沙盒里读写文件,但是,不可以访问其他APP的沙盒.每一个APP都是一个信息孤岛,相互是不可以进行通信的,唯独可以通过URL Scheme.沙盒里面的文件可以是照片.声音文件. ...
- iOS沙盒机制的基本操作总结
每个ios程序都有自己的沙盒(sandBox),ios8之后提供沙盒部分开放 我们可以访问沙盒下的文件夹 文件夹包括: 1,documents:保存应用运行时生成的需要持久化的数据 2.tem:保存临 ...
- 再谈CVE-2017-7047 Triple_Fetch和iOS 10.3.2沙盒逃逸
作者:蒸米 ----------------- 0x00 序 Ian Beer@google发布了CVE-2017-7047Triple_Fetch的exp和writeup[1],chenliang@ ...
- iOS沙盒及数据存储
时间久了容易忘,针对沙盒的相关实用技巧做一个记录和整理. 一.iOS数据存储常用方式 1.XML属性列表(plist) 不是所有对象都可以写入: 2.Preference(偏好设置) 本质还是通过“p ...
随机推荐
- 开源服务专题之--------mysql的编译安装
为什么选择MySQL 1:mysql性能卓越,服务稳定,很少出现异常宕机 2:mysql开源免费,无版权制约,自主性及使用成本低 3:产品耦合度,mysql支持多种操作系统,支持多开发语言,特别是ph ...
- OpenStack虚拟云桌面在携程呼叫中心的应用
编者:本文为刘科在第六期[携程技术微分享]中的分享内容.在携程技术中心(微信号ctriptech)微信后台回复[云桌面],可加入微信交流群,和关注云桌面的小伙伴一起玩耍~ 刘科,携程系统研发云平台桌面 ...
- 试试用有限状态机的思路来定义javascript组件
本文是一篇学习性的文章,学习利用有限状态机的思想来定义javascript组件的方法,欢迎阅读,后续计划会写几篇专门介绍自己利用有限状态机帮助自己编写组件的博客,证明这种思路对于编程实现的价值,目前正 ...
- WCF双工通讯以及客户端间的间接通讯
由于学习计划安排不当,对WCF的认知一直停滞不前,最近工作上又用回了WCF,重拾一下,看到蒋老师介绍双工通讯的博文,实践一下,积累一下.原想着WCF的双工通讯就是原本的客户端能调用服务端的方法之余,服 ...
- C# ~ 从 XML 到 Linq 到 Linq to XML
.XML 可扩展标记语言 (Extensible Markup Language), 标记 (markup) 是关键部分,是标准通用标记语言 (Standard Generalized Markup ...
- Java中使用Jedis操作Redis
使用Java操作Redis需要jedis-2.1.0.jar,下载地址:http://files.cnblogs.com/liuling/jedis-2.1.0.jar.zip 如果需要使用Redis ...
- Javascript——闭包、作用域链
1.闭包:是指有权访问另一个函数作用域中的变量的函数.创建闭包的常见方式:在一个函数内部创建另一个函数. function f(name){ return function(object){ var ...
- jquery 集合操作
修剪字符串 $.trim(value) 功能: 删除传入的字符串开头和结尾的空白 [空白]匹配js正则中的\s,也就是包括空白,换行,回车,制表符,换页以及Unicode字符\u00A0 返回值: 返 ...
- CentOS6.5下安装PostgreSQL
一.配置 YUM 仓库 修改原始的 yum 仓库配置: vim /etc/yum.repos.d/CentOS-Base.repo 在[base]和[updates] 节(section)部分的尾部插 ...
- singleCall单来源调用解析及实现
定义: 单来源调用指一个类的生成工作只能由特定类来执行. eg李宁牌鞋子只能由李宁专卖店生产 这个问题归结起来,也就是说在工厂模式中,指定的产品类只能通过具体的特定工厂类来生成,而不能自己new出来或 ...