延时执行的两种方法(在线程中)
2016-01-10 15:15
411 查看
在主线程可以执行.
主线程和子线程的区别:
每一条线程都有一个"运行循环".默认:主线程的运行循环是开启的,子线程的运行循环是关闭的.
有些方法是需要运行循环来执行的:(UI操作/定时器)
开启子线程的运行循环.
[[NSRunLoop currentRunLoop] run];
只能开,关不了.
CFRunLoopRun();
能够开启和关闭运行循环.
注意:
开启运行循环需要事件源(UI操作/定时器)的驱动.必须先有事件源,才能开启运行循环.
开启运行循环:
运行循环是一个死循环.当开启运行循环之后,相当于在这个位置添加了一个死循环.死循环后面的内容永
远不会被执行到.除非运行循环关闭.
有某些特殊的事件源:事件结束之后,运行循环就会自动关闭.
1.延时执行 :[self performSelector:@selector(test) withObject:nil
afterDelay:3];
2.NSUrlConnection
的代理方法.
例子:
运行结果:
2016-01-10 15:19:56.151 14-延时执行[1079:80773] touchesBegan
2016-01-10 15:19:56.151 14-延时执行[1079:80773] touchesEnd
2016-01-10 15:19:59.155 14-延时执行[1079:81068] ---------------
2016-01-10 15:19:59.155 14-延时执行[1079:81068] *********************
主线程和子线程的区别:
每一条线程都有一个"运行循环".默认:主线程的运行循环是开启的,子线程的运行循环是关闭的.
有些方法是需要运行循环来执行的:(UI操作/定时器)
开启子线程的运行循环.
[[NSRunLoop currentRunLoop] run];
只能开,关不了.
CFRunLoopRun();
能够开启和关闭运行循环.
注意:
开启运行循环需要事件源(UI操作/定时器)的驱动.必须先有事件源,才能开启运行循环.
开启运行循环:
运行循环是一个死循环.当开启运行循环之后,相当于在这个位置添加了一个死循环.死循环后面的内容永
远不会被执行到.除非运行循环关闭.
有某些特殊的事件源:事件结束之后,运行循环就会自动关闭.
1.延时执行 :[self performSelector:@selector(test) withObject:nil
afterDelay:3];
2.NSUrlConnection
的代理方法.
例子:
// // ViewController.m // 延时执行 #import "ViewController.h" @interface ViewController () @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib. } - (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event { // 延时执行. NSLog(@"touchesBegan"); // 在主线程可以执行. // 主线程和子线程的区别: // 每一条线程都有一个"运行循环".默认:主线程的运行循环是开启的,子线程的运行循环是关闭的. // 有些方法是需要运行循环来执行的:(UI操作/定时器) // 开启子线程的运行循环. // [[NSRunLoop currentRunLoop] run]; 只能开,关不了. // CFRunLoopRun(); 能够开启和关闭运行循环. // 注意: 开启运行循环需要事件源(UI操作/定时器)的驱动.必须先有事件源,才能开启运行循环. dispatch_async(dispatch_get_global_queue(0, 0), ^{ [self performSelector:@selector(test) withObject:nil afterDelay:3]; // 开启运行循环 // 运行循环是一个死循环.当开启运行循环之后,相当于在这个位置添加了一个死循环.死循环后面的内容永远不会被执行到.除非运行循环关闭. // 有某些特殊的事件源:事件结束之后,运行循环就会自动关闭. // 1.延时执行 :[self performSelector:@selector(test) withObject:nil afterDelay:3]; // 2.NSUrlConnection 的代理方法. CFRunLoopRun(); NSLog(@"*********************"); }); NSLog(@"touchesEnd"); } - (void)test { NSLog(@"---------------"); } - (void)test1 { dispatch_async(dispatch_get_global_queue(0, 0), ^{ // 不会阻塞当前线程. dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(3 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ NSLog(@"-------------"); }); }); } @end
运行结果:
2016-01-10 15:19:56.151 14-延时执行[1079:80773] touchesBegan
2016-01-10 15:19:56.151 14-延时执行[1079:80773] touchesEnd
2016-01-10 15:19:59.155 14-延时执行[1079:81068] ---------------
2016-01-10 15:19:59.155 14-延时执行[1079:81068] *********************
相关文章推荐
- react native组件学习(三)
- 智慧北京笔记1
- Maven 使用介绍
- CentOS下设置vimrc,添加文件注释信息以及设置tab 键为4 格
- js密码强度校验
- 安装完最小化 RHEL/CentOS 7 后需要做的 30 件事情(三)码农网
- Android插件化及动态加载
- 利用叉积判断点和线的关系
- 如何拍摄一组照片
- 大端小端字节序(图解)
- delphi 2010 导出sql server 数据到DBF乱码问题
- OC中超级无敌排序方法,降序 升序 自定义降序升序
- 安装完最小化 RHEL/CentOS 7 后需要做的 30 件事情(二)转载自码农网
- 使用Condition的生产者消费者模式
- 自建git仓库
- ROS naviagtion analysis: costmap_2d--LayeredCostmap
- Spring官方下载方式
- Gson使用指南
- 可删除超炫&多种特效的Card视图(改造自cardsui-for-android开源项目),提供DEMO下载
- hdoj--3592--World Exhibition(差分约束)