RunLoop(运行循环)-002-加载大图

p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px "Yuanti SC"; color: #ff2600; background-color: #ffffff }
p.p2 { margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px "Yuanti SC"; color: #008400; background-color: #ffffff }
p.p3 { margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px "Yuanti SC"; color: #000000; background-color: #ffffff }
p.p4 { margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px "Yuanti SC"; color: #aa7942; background-color: #ffffff }
p.p5 { margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px "Yuanti SC"; color: #919191; background-color: #ffffff }
p.p6 { margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px "Yuanti SC"; color: #0433ff; background-color: #ffffff }
p.p7 { margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px "Yuanti SC"; color: #ba2da2; background-color: #ffffff }
p.p8 { margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px "Yuanti SC"; color: #000000; background-color: #ffffff; min-height: 20.0px }
p.p9 { margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px "Yuanti SC"; color: #78492a; background-color: #ffffff }
p.p10 { margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px "Yuanti SC"; color: #3e1e81; background-color: #ffffff }
p.p11 { margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px "Yuanti SC"; color: #4f8187; background-color: #ffffff }
p.p12 { margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px "Yuanti SC"; color: #703daa; background-color: #ffffff }
p.p13 { margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px "Yuanti SC"; color: #31595d; background-color: #ffffff }
span.s1 { color: #000000 }
span.s2 { color: #0433ff }
span.s3 { color: #ff40ff }
span.s4 { color: #008400 }
span.s5 { color: #ff2600 }
span.s6 { color: #ba2da2 }
span.s7 { color: #703daa }
span.s8 { color: #4f8187 }
span.s9 { color: #3e1e81 }
span.s10 { color: #272ad8 }
span.s11 { color: #31595d }
span.s12 { color: #aa7942 }
span.s13 { color: #d12f1b }

UI界面滑动视图时会卡顿,分析卡顿的原因

1.渲染图片耗时!! -- 分段加载图片!!

每次Runloop循环,最多需要加载18张大图  所以卡住了

思路:

每次Runloop循环,只渲染一张大图!!

步骤:

1.监听Runloop的循环!!

2.将加载大图的代码!放在一个数组里面!!

3.每次Runloop循环,取出一个加载大图的任务执行!!

在创建UI滑动视图之后调用: addRunloopObserver

typedef void(^runloopBlock)(void);//Ref 引用

@property(nonatomic,strong)NSMutableArray * tasks;

#pragma mark - <CFRunloop>

-(void)addTasks:(runloopBlock)task{

[self.tasks addObject:task];

if (self.tasks.count > 18) {//Runloop 最大加载18张大图

[self.tasks removeObjectAtIndex:0];

}

}

-(void)addRunloopObserver{

//获取Runloop

CFRunLoopRef runloop = CFRunLoopGetCurrent();

//定义一个context

CFRunLoopObserverContext context = {

0,

(__bridge void *)(self),

&CFRetain,

&CFRelease,

NULL

};

//定义观察者

static CFRunLoopObserverRef runloopObserver;

runloopObserver = CFRunLoopObserverCreate(NULL, kCFRunLoopBeforeWaiting, YES, 0, &callBack, &context);

//添加观察者

CFRunLoopAddObserver(runloop, runloopObserver, kCFRunLoopCommonModes);

//C里面 一旦creat new copy 有堆空间 需要自己手动释放

CFRelease(runloopObserver);

}

void  callBack(CFRunLoopObserverRef observer, CFRunLoopActivity activity, void *info){

//activity BeforeWaiting

NSLog(@"%@",info);

ViewController * vc = (__bridge ViewController *)info;

if(vc.tasks.count == 0){

return;

}

runloopBlock block = vc.tasks.firstObject;

block();

[vc.tasks removeObjectAtIndex:0];

}

使用

- (void)viewDidLoad {

[super viewDidLoad];

[NSTimer scheduledTimerWithTimeInterval:0.0001 target:self selector:@selector(timerMethod) userInfo:nil repeats:YES];

_tasks = [NSMutableArray array];

//setupUI

[self addRunloopObserver];

}

-(void)timerMethod{

//不干任何事情!

}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:IDENTIFIER];

cell.selectionStyle = UITableViewCellSelectionStyleNone;

//干掉contentView上面的子控件!! 节约内存!!

for (NSInteger i = 1; i <= 5; i++) {

//干掉contentView 上面的所有子控件!!

[[cell.contentView viewWithTag:i] removeFromSuperview];

}

//添加文字

[ViewController addlabel:cell indexPath:indexPath];

//添加图片

[self addTasks:^{

[ViewController addImage1With:cell];

}];

[self addTasks:^{

[ViewController addImage2With:cell];

}];

[self addTasks:^{

[ViewController addImage3With:cell];

}];

return cell;

}

原文地址:https://www.cnblogs.com/StevenHuSir/p/RunLoop_LoadBigImage.html

时间: 2024-11-13 06:41:09

RunLoop(运行循环)-002-加载大图的相关文章

Runloop 运行循环

什么是RunLoop 运行循环 一个线程对应一个RunLoop,主线程的RunLoop默认已经启动,子线程的RunLoop得手动启动(懒加载, 调用currentRunLoop方法) RunLoop只能选择一个Mode启动,如果当前Mode中没有任何Source(Sources0.Sources1).Timer,那么就直接退出RunLoop RunLoop作用 保持程序的持续运行 处理App中的各种事件(比如触摸事件.定时器事件.Selector事件) 节省CPU资源,提高程序性能:该做事时做事

javascript图片加载---加载大图的一个解决方案

网页在加载一张大图片时,往往要加载很久: 而且,在加载过程中,无法很好地控制图片的样式,容易造成错位等显示错误: 如果能够在加载大图时,先使用一张较小的loading图片占位,然后后台加载大图片,当大图片加载完成后,自动替换占位图, 这样能提供更好的用户体验: 由于,我在开发一个图片查看器时,遇到这样的需求,所以我写了个angular服务,来解决这个问题,效果还不错: 虽然是angular服务,当是把里面核心代码抽出来也可以单独使用: 来分享下源代码: 一: var imgloader = ne

Android 高效加载大图,多图解决方案,有效避免程序OOM

高效加载大图片 我们在编写Android程序的时候经常要用到许多图片,不同图片总是会有不同的形状.不同的大小,但在大多数情况下,这些图片都会大于我们程序所需要的大小.比如说系统图片库里展示的图片大都是用手机摄像头拍出来的,这些图片的分辨率会比我们手机屏幕的分辨率高得多.大家应该知道,我们编写的应用程序都是有一定内存限制的,程序占用了过高的内存就容易出现OOM(OutOfMemory)异常.我们可以通过下面的代码看出每个应用程序最高可用内存是多少. [java] view plaincopy in

Runloop(运行循环)是什么?

运行循环是什么?从介绍到演示 今天整理一下运行循环来帮朋友们了解一下什么是运行循环,也叫消息循环,建议大家称之为运行循环(Runloop). 关于多线程的运行循环(消息循环) 1. 什么是运行循环 (1)Runloop就是运行循环,每个线程内部都有一个运行循环. (2)只有主线程的运行循环默认是开启的,子线程的运行循环. 2. 运行循环的作用 (1)保证程序不退出,iOS的应用程序启动之后,之所以不会退出,就是因为有Runloop(运行循环).运行循环是一个死循环,只有满足一定条件才会结束循环.

解决MWPhotoBrowser中的SDWebImage加载大图导致的内存警告问题

解决MWPhotoBrowser中的SDWebImage加载大图导致的内存警告问题 iOS开发 · 2015-01-22 11:31 MWPhotoBrowser是一个非常不错的照片浏览器,在github的star接近3000个,地址:https://github.com/mwaterfall/MWPhotoBrowser.git MWPhotoBrowser来加载小图1M以下的都应该不会有内存警告的问题.如果遇到大图,3M.4M.5M的大图,很有可能导致内存警告.最近我就遇到这个问题,很是头疼

Android中高效的显示图片之一 ——加载大图

在网上看了不少文章,发现还是官方文档介绍最详细,把重要的东西简单摘要出来.详细可看官方文档地址 ( http://www.bangchui.org/read.php?tid=9 ) . 在应用中显示图片,如果不多加小心,很容易就会使应用因为异常“java.lang.OutofMemoryError:bitmap size exceeds VM budget”而导致crash.在android中加载图片需要一定的技巧性,主要是因为: 1.通常设备资源有限,安卓设备给每个应用只分配16M的空间.当然

VS2012运行Cocos2d-xTest案例加载失败解决方案

编译cocos2d-x,一直提示加载失败 通过搜索,解决方案如下: 第一步,通过命令提示行工具进入VS安装目录下的%VS2012home%Common7\IDE 第二部,执行devenv.exe /setup /resetuserdata /resetsettings 第三步,重新加载sln文件 VS2012运行Cocos2d-xTest案例加载失败解决方案

Android 加载大图

在 Android 开发中, Bitmap 是个吃内存大户,稍微操作不当就会 OOM .虽然现在第三方的图片加载库已经很多,很完善,但是作为一个 Androider 还得知道如何自己进行操作来加载大图. 为什么加载图片会很容易造成 OOM 呢,主要是从图片加载到内存说起,假如一个图片的分辨率是 1000*20000,那么这张图片加载的内存中的大致大小为 1000*20000*4 = 80000000 字节,那么就是占用内存为 77 M 左右,这样的话,很容易造成 OOM . 为了不 OOM ,A

RunLoop运行循环机制

http://www.jianshu.com/p/0be6be50e461 基本概念 进程 进程是指在系统中正在运行的一个应用程序,而且每个进程之间是独立的,它们都运行在其专用且受保护的内存空间内,比如同时打开迅雷.Xcode,系统就会分别启动两个进程. 线程 一个人进程如果想要执行任务,必须得有至少一条线程,进程的所有任务都会在线程中执行,比如使用网易云音乐播放音乐,使用迅雷下载电影,都需要在线程中执行. 主线程 iOS 程序运行后,系统会默认开启一条线程,称为“主线程”或者“UI 线程”,主