2016 - 1 - 20 runloop学习(2)

一:CFRunLoopModeRef

1. CFRunLoopModeRef带表RunLoop的运行模式

2. 一个Runloop可以有若干个mode,每个mode又包含若干个sourse,timer,observer

3. 每当RunLoop启动时,只能指定其中一个mode,这个Mode被称为CurrentMode

    [[NSRunLoop currentRunLoop].currentMode

如果需要切换Mode,只能退出Runloop,再重新指定一个Mode来运行。这样做的目的就是为了分割不同组的Source/Timer/Observer.

4.两个常用的Mode

4.1 kCFRunLoopDefaultMode:App的默认Mode,通常主线程是在这个Mode中运行的。

4.2 UITrackingRunLoopMode:界面跟踪Mode,用于ScrollView追踪触摸滑动,保证界面滑动时,不受其他Mode影响。

二:添加定时器到不同Mode中的区别

1.当程序中有scrollView等滚动时,RunLoop的模式切换为UITrackingRunLoopMode,如果将定时器添加到NSDefaultRunloopMode中,滚动比如textView定时器将不工作。如以下代码:

- (void)viewDidLoad {
    [super viewDidLoad];
    NSTimer *timer =   [NSTimer timerWithTimeInterval:2.0 target:self selector:@selector(run) userInfo:nil repeats:YES ];
    // 将定时器添加到当前主线程的RunLoop的默认Mode下
    // 可以发现,当textView滚动时,不会打印
    [[NSRunLoop currentRunLoop ] addTimer:timer forMode:NSDefaultRunLoopMode];
}
- (void)run{
    NSLog(@"%s",__func__);
}

2.如果将定时器加入的Mode设为NSRunLoopCommonModes时,则当RunLoop为NSDefaultRunloopMode与UITrackingRunLoopMode时都将工作。

    [super viewDidLoad];
    NSTimer *timer =   [NSTimer timerWithTimeInterval:2.0 target:self selector:@selector(run) userInfo:nil repeats:YES ];
    // 将定时器添加到当前主线程的RunLoop的默认Mode下
    // 如果改为forMode:NSRunLoopCommonModes,则定时器继续工作
    [[NSRunLoop currentRunLoop ] addTimer:timer forMode:NSRunLoopCommonModes];
}
- (void)run{
    NSLog(@"%s",__func__);
}

3.可以在打印RunLoop对象中发现:

可以发现,NSRunLoopCommonModes其实相当于一个标记符,标记某些Mode,默认标记是DefaulMode与TrackingMode。

时间: 2024-09-29 05:49:00

2016 - 1 - 20 runloop学习(2)的相关文章

2016 - 1 - 20 runloop学习

一:Runloop基本知识 1.本质就是运行循环 2.基本作用: 2.1保证程序持续运行 2.2处理APP中的各种事件:触摸,定时器,selector... 2.3节省CPU资源,系统程序性能:它会让主线程在工作时工作,非工作时休息. 2.4.... 二:main函数中的Runloop 1. 1 int main(int argc, char * argv[]) { 2 @autoreleasepool { 3 return UIApplicationMain(argc, argv, nil,

2016年5月份学习记录

                             2016年5月份学习记录 学c++都快5个月了,连一篇完整的学习记录都没写过,今天突发奇想(其实本来就应该写),就写了这么一篇学习记录(呵呵). 最近几天,一会不是写解题报告,就是做poj,有时玩会自己编(参考了别人代码的)的2048,页面做的还不错,还做coj.都快忙不过来了.最近又翻出一本叫<数据结构>的书,是清华大学的邓俊辉老师写的,很详细,还有示意图,很不错的书.准备“啃”个三四遍,反正一周“啃”完一次,课间也在那儿拼命地看,自

2016/02/20 codes

<!DOCTYPE html><html><head lang="en"> <meta charset="UTF-8"> <title>2016/02/20</title></head><body><div id="mainDiv"> <div id = "content"> <div id = &qu

2016年大学生研究性学习和创新性实验计划项目 我的项目 :二维码数据反馈系统 第四周作业

参加软件班后介于一直没有实训的机会,感觉自己应该主动找点项目,提升自己的技术水平,这次在老师和同学的帮助下参加了2016年大学生研究性学习和创新性实验计划项目: 下面是我参与的项目的一些简介: 项目名:二维码数据反馈系统    简述:二维码具有面积小,信息容量大,安全性高,读取率高,纠错能力强等优点,不仅能够存储足够的物品信息,还具有抗干扰能力强.运用环境适应性好.使用成本低廉等优点, 现今成为各种产品  防伪的首要选择.        项目的创新点和特色 :传统的生产厂商通过条形码来记录商品信

2016/7/20 1:18:29 PyQT5 炫酷的左侧导航效果

2016/7/20 1:18:29  完整code from PyQt5.QtWidgets import (QApplication, QWidget, QHBoxLayout, QTreeWidget, QTreeWidgetItem, QGroupBox) from PyQt5.QtGui import QIcon, QPixmap from PyQt5.QtCore import QSize class Bar_Navigation(QWidget): def __init__(self

2016.02.20 学习笔记 数据在Activity之间的传递的情况

情况一:一个Activity跳转到另一个Activity时,将第一个Activity的数据传递到第二个Activity里面. 分析:当一个界面跳转到另一个界面的同时还要讲数据传递过去,这种情况需要用Intent类putExtra()方法实现. 具体在Onclick方法中的样例代码如下: Intent i1=new Intent(this,SecondActivity.class); String Message=Edit1.getText().toString(); i1.putExtra("M

学习进度(2016.3.20)

  第三周 所花时间(包括上课) 15小时 代码量(行) 400行 博客量(篇) 2篇 了解到的知识点 计算四则表达式的值,数据类型的转换

2016.2.20 css3 animation 的学习

使用css3 animation动画 'use strict'; var mousex, mousey; function tuo(el) { var move = function () { el.style.left = event.x - mousex + 'px'; el.style.top = event.y - mousey + 'px'; }; el.addEventListener('mousedown', function () { mousex = event.x - el.

分布式技术一周技术动态 2016.03.20

分布式系统实践 1. 基于Mesos和Docker的分布式计算平台 https://mp.weixin.qq.com/s?__biz=MzAxMDgzOTA2Mw==&mid=402769128&idx=1&sn=cea3ad1357bd9312acf1768c0a493bfd&scene=1&srcid=0318BTuxT0fsFYwPjpeyuDOa&key=710a5d99946419d90fbc1e7600cce055b6e997d6afafc74c