iOS——Runloop使用示例

一、UITrackingRunLoopMode与NSTimer

下面的方法Timer被添加到NSDefaultRunLoopMode,在滑动Scrollview的时候系统会切换至UITrackingRunLoopMode,Timer就会暂时停止.

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

当存在 tableView/scrollView 滑动时,若不希望Timer被滑动影响,需添加到NSRunLoopCommonMode.

  NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(timerTick:) userInfo:nil repeats:YES];  
  [[NSRunLoop currentRunLoop]addTimer:timer forMode:NSRunLoopCommonModes];

二、通过runloop解决在 tableView 滚动时候停止加载图片的需求

利用RunLoop 不同 mode 的特性,可以将图片的加载放到NSDefaultRunLoopMode的mode里,这样在滚动UITrackingRunLoopMode这个mode时不会被加载而影响到。

UIImage *downloadedImage = ...;
[self.avatarImageView performSelector:@selector(setImage:) withObject:downloadedImage afterDelay:0 inModes:@[NSDefaultRunLoopMode]];

三、runloop 解决在 tableView 中同时加载多个大图的使用

runloop 中最先响应的 UI 的绘制, tableView 在滑动时就需要在一次 runloop 循环中绘制所有的屏幕上的图片,如果在 cellForxxx 方法中有imageView.image = image 等代码,这部分会非常消耗资源(尤其在图片较大的情况),一次 runloop 执行时间太长, 就会导致 UI 响应变慢, 直观感受就是 app 卡顿严重.

解决思路

原来是一次runloop 中绘制所有的 view 中显示出来的图片,那么为什么不在一次 runloop 时候只绘制一张图片. 这样每次 runloop 需要完成的内容较少,UI 才不会卡顿.

具体实践

首先封装一个task queue,用它观察 RunLoop 的状态, 当 RunLoop 的状态是 kCFRunLoopBeforeWaiting,取出 queue 中的第一个 task 然后执行,然后将该 task 移除 queue. queue 中的 task 是一个个将耗时任务封装的成的代码块. 在 tableView 的 cellForRowAtIndexPath 方法中,我们将 task 代码块加入到 queue 中,让 queue 根据 RunLoop 的状态每次在进入睡眠前执行一个 task.

https://github.com/diwu/RunLoopWorkDistribution

四、runloop 监控 App 卡顿,并查找具体卡顿函数的方法

app 卡顿的定义

mainRunLoop 中一次 RunLoop 循环执行时间过长,导致新的事件传递到 RunLoop 中响应不及时, 直观感受就是卡顿.因此可以通过一定方法求出,第一次进入 RunLoop 与第二次进入 RunLoop 之间的时间, 如果这个时间超过某阀值,就说明 App 卡顿.

具体实践

使用 global 线程中监听 mainRunLoop 的状态, 使用使用 semaphore 来进行超时统计(超时时间就是 runloop 的阀值)管理. 如果连续多次超时,就使用 CrashReport 打印出当前函数调用栈的内容.
https://github.com/suifengqjn/PerformanceMonitor

还在学习中,不足之处,请谅解!
本文转自http://www.jianshu.com/p/924cb2b218f5

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,884评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,755评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,369评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,799评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,910评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,096评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,159评论 3 411
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,917评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,360评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,673评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,814评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,509评论 4 334
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,156评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,882评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,123评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,641评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,728评论 2 351

推荐阅读更多精彩内容