iOS中RunLoop和线程的关系
RunLoop又叫运行循环,主要用来管理线程。一个线程对应一个RunLoop,一个RunLoop又有五种模式。只有主线程的RunLoop是默认开启的,所以程序在开启后,会一直运行,不会退出。其他线程的RunLoop如果需要开启,就手动开启。
1. kCFRunLoopDefaultMode:App的默认Mode,通常主线程是在这个Mode下运行
2. UITrackingRunLoopMode:界面跟踪 Mode,用于 ScrollView 追踪触摸滑动,保证界面滑动时不受其他 Mode 影响
3. UIInitializationRunLoopMode: 在刚启动 App 时第进入的第一个 Mode,启动完成后就不再使用,会切换到kCFRunLoopDefaultMode
4. GSEventReceiveRunLoopMode: 接受系统事件的内部 Mode,通常用不到
5. kCFRunLoopCommonModes: 这是一个占位用的Mode,作为标记kCFRunLoopDefaultMode和UITrackingRunLoopMode用,并不是一种真正的Mode
NSTimer为什么不准确?怎样实现一个精确的计时器?
不准的原因如下
- NSTimer加在main runloop中,模式是NSDefaultRunLoopMode,main负责所有主线程事件,例如UI界面的操作,复杂的运算,这样在同一个runloop中timer就会产生阻塞。
- 模式的改变。Timer 并加到 DefaultMode 时,Timer 会得到重复回调,但此时滑动一个ScrollView时,RunLoop 会将 mode 切换TrackingRunLoopMode,这时 Timer 不会被回调,并且也不会影响到滑动操作。所以就会影响到NSTimer不准的情况
==解决方法==
1.在主线程中进行NSTimer操作,但是将NSTimer实例加到main runloop的特定mode(模式)中。避免被复杂运算操作或者UI界面刷新所干扰。
self.timer = [NSTimer timerWithTimeInterval:1 target:self selector:@selector(showTime) userInfo:nil repeats:YES];
[[NSRunLoop currentRunLoop] addTimer:self.timer forMode:NSRunLoopCommonModes];
2、在子线程中进行NSTimer的操作,再在主线程中修改UI界面显示操作结果
iOS中RunLoop和线程的关系的更多相关文章
- 转iOS中delegate、protocol的关系
iOS中delegate.protocol的关系 分类: iOS Development2014-02-12 10:47 277人阅读 评论(0) 收藏 举报 delegateiosprocotolc ...
- iOS中的NSOperation线程
1.除NSThread之外的第二种多线程的编程方法 2.采用NSOperation(线程操作,通常用他的子类)和NSOperationQueue(线程队列)搭配来做多线程开发,采用NSOperat ...
- iOS 中 UIView 和 CALayer 的关系
UIView 有一个名叫 layer ,类型为 CALayer 的对象属性,它们的行为很相似,主要区别在于:CALayer 继承自 NSObject ,不能够响应事件. 这是因为 UIView 除了负 ...
- iOS中进程与线程(多线程、主次线程)
一.什么是线程?什么是多线程? 线程是用来执行任务的,线程彻底执行完任务A才能去执行任务B.为了同时执行两个任务,产生了多线程. 例子: 打开一个音乐软件,用户开辟一个线程A ...
- iOS中的GCD线程
一.什么是GCD 全称是Grand Central Dispatch ,纯C语言编写,提供非常多强大的函数,是目前苹果官网推荐的多线程开发方法,NSOperation 便是基于GCD的封装 ...
- iOS中使用子线程的完整方法
http://www.cnblogs.com/ygm900/archive/2013/06/23/3151691.html 第一步:开启子线程 //开启子线程到网络上获取数据 myFirstThrea ...
- ios中图层和view的关系
-(void)viewMethod{ //1: 要明白uiview内部是这样实现 CALayer *layer1= [CALayer layer]; layer.delegate=self; [lay ...
- runloop与线程的关系
- IOS 中得runloop 详细解释
1.Runloop基础知识- 1.1 字面意思 a 运行循环 b 跑圈 - 1.2 基本作用(作用重大) a 保持程序的持续运行(ios程序为什么能一直活着不会死) b 处理app中的各种事件(比如触 ...
- iOS开发RunLoop学习:一:RunLoop简单介绍
一:RunLoop的简单介绍 #import "ViewController.h" @interface ViewController () @end @implementatio ...
随机推荐
- 【Spring-Security】Re02 基础认证流程
一.权限认证模拟操作: 编写Security配置类: package cn.zeal4j.configuration; import org.springframework.context.annot ...
- 关于spinninup的学习笔记
作为reinforcement learning的一个入门学习的项目,spinningup的地址: (英文原版:) https://spinningup.openai.com/en/latest/in ...
- python代码实现将PDF文件转为文本及其对应的音频
代码地址: https://github.com/TiffinTech/python-pdf-audo ============================================ imp ...
- AtCoder Beginner Contest 315
AtCoder Beginner Contest 315 A - tcdr (atcoder.jp) 一次遍历 #include<bits/stdc++.h> using i64 = lo ...
- 流体饱和多孔介质的本构关系 + Föppl-von Kármán 方程
向有液体的多孔介质上施加应力,应力一部分分布到骨架上,一部分分布到孔隙流体上.骨架上的应力会导致变形,所以被称为 "有效应力".这里考虑拉伸应力为正,有效应力原理写为 \[\sig ...
- nginx配置请求头防止点击劫持
在返回index.html配置中加入add_header X-Frame-Options DENY; location / {undefined root /data/nginx/html/dist/ ...
- Win32_SDK 屏蔽Edit控件的右键系统菜单方法
找了好久的方法,网上都是基于mfc的方法,现在找到解决方法了,分享给大家, 就是要重新设置Edit控件的回调函数 //Win32 SDK 下Edit控件屏蔽右键系统菜单方法 第一步: //声明保存旧的 ...
- hacs安装
安装 HACS 直接使用 Docker 的可视化管理面板 Portainer 或者通过命令行进入 Docker 容器,然后执行以下安装命令: docker exec -it <容器名称或容器ID ...
- AArch64 汇编学习笔记
PIE(Position Independent Executable,位置无关的可执行文件)通过随机化可执行文件各个部分在虚拟内存中的地址使得攻击者无法通过预测地址进行恶意行为. 汇编开发工具: a ...
- Linux/macOS 查看网络接口
Linux 显示网络设备的状态: $ nmcli device status DEVICE TYPE STATE CONNECTION enp0s5 ethernet connected Wired ...