[iOS学习笔记]runloop runMode方法调研

 
//
//  ViewController.m
//  ThreadTest
//
//  Created by skyko on 16/5/31.
//  Copyright © 2016年 helios. All rights reserved.
//

#import "ViewController.h"

@interface ViewController ()

@property (nonatomic, strong) NSThread *thread;

@property (nonatomic, assign) BOOL isAlive;

@property (nonatomic, strong) NSTimer *timer;

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    NSLog(@"viewDidLoad");
    self.isAlive = YES;

    self.thread = [[NSThread alloc] initWithTarget:self
                                          selector:@selector(workThread:)
                                            object:nil];
    [self.thread setName:@"MyCustomThread"];
    [self.thread start];

    //延迟3s后向线程添加任务
    dispatch_time_t time = dispatch_time(DISPATCH_TIME_NOW, 3 * NSEC_PER_SEC);
    dispatch_after(time, dispatch_get_main_queue(), ^{
        [self performSelector:@selector(handleSomeThing)
                     onThread:self.thread
                   withObject:nil
                waitUntilDone:NO];
    });
}

- (void)workThread:(id)data {
    NSLog(@"workThread");
    NSRunLoop *runloop = [NSRunLoop currentRunLoop];
    [runloop addPort:[NSMachPort port] forMode:NSDefaultRunLoopMode];//不添加这一行的话,在有任务添加前下面的while循环会一直执行,原因见后面解释

    while (_isAlive) { //isAlive用于控制该线程的运行周期,当设置isAlive为NO时,该线程执行完当前任务后退出并销毁
        NSLog(@"--->");
        //在设置的时间内执行NSDefaultRunLoopMode模式的任务
        //如果队列中暂时没有任务会一直堵塞直至有任务进入队列
        //任务执行完成后接着循环
        //超时会进入下一次循环
        [runloop runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]];
        NSLog(@"<---");
    }
}

- (void)handleSomeThing {
    NSLog(@"handleSomeThing before sleep");
    [NSThread sleepForTimeInterval:1.0f];
    NSLog(@"handleSomeThing after sleep");
}

@end

运行结果打印:

2016-05-31 11:42:25.020 ThreadTest[1940:76011] viewDidLoad
2016-05-31 11:42:25.020 ThreadTest[1940:76221] workThread
2016-05-31 11:42:25.021 ThreadTest[1940:76221] --->
2016-05-31 11:42:28.311 ThreadTest[1940:76221] handleSomeThing before sleep
2016-05-31 11:42:29.315 ThreadTest[1940:76221] handleSomeThing after sleep
2016-05-31 11:42:29.315 ThreadTest[1940:76221] <---
2016-05-31 11:42:29.315 ThreadTest[1940:76221] --->

原文文档介绍:

Runs the loop once, blocking for input in the specified mode until a given date.

//执行loop一次,堵塞等待给定模式的输入直至给定的时间点

Parameters


mode


The mode in which to run. You may specify custom modes or use one of the modes listed in Run Loop Modes.


limitDate


The date until which to block.

Return Value

YES if the run loop ran and processed an input source or if the specified timeout value was reached; otherwise, NO if the run loop could not be started.

//当runloop正在运行并处理了一个输入源或者超时返回YES,否则如果runloop并未启动就返回NO

Discussion

If no input sources or timers are attached to the run loop, this method exits immediately and returns NO; otherwise, it returns after either the first input source is processed or limitDate is reached. Manually removing all known input sources and timers from the run loop does not guarantee that the run loop will exit immediately. OS X may install and remove additional input sources as needed to process requests targeted at the receiver’s thread. Those sources could therefore prevent the run loop from exiting.

如果没有一个输入源或者timer添加到runloop中,该方法会立刻退出并返回NO(这就是上面demo中添加下面代码的原因),否则该方法会在执行完队列中第一个输入源或超时后返回,手动移除runloop中所有输入源和timer并不能保证runloop立刻退出.OS X系统可能在线程中添加或移除一些额外的输入源来处理必须的任务,因此这些输入源可能会阻止runloop的退出.

[runloop addPort:[NSMachPort port] forMode:NSDefaultRunLoopMode];

NOTE

A timer is not considered an input source and may fire multiple times while waiting for this method to return

timer不是一个输入源并且可能在等待该方法返回过程中会多次启动

 

总结:

[runloop runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]];
1.在设置的时间内执行设置的模式的任务
2.如果队列中暂时没有任务会一直堵塞直至有任务进入队列
3.任务执行完成后该方法退出
4.超时后该方法退出
 
时间: 2024-07-29 03:13:49

[iOS学习笔记]runloop runMode方法调研的相关文章

2015 IOS 学习笔记 面向对象 初始化方法 ——蓝懿教育

今天学习了面向对象以及初始化方法,这个在实际应用中比较重要,也比较抽象,所以要具体在实例中才能理解. ————————面向对象有三大特性—————— 一.封装 封装是对象和类概念的主要特性.它是隐藏内部实现,稳定外部接口,可以看作是“包装”.封装,也就是把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏. 好处:使用更简单变量更安全可以隐藏内部实现细节开发速度加快 OC中一个类可以继承另一个类,被继承的类成为超类(superclass),继承的

2015 IOS 学习笔记 for循环 方法练习 ——蓝懿教育

今天学习了for循环以及方法,内容有些复杂,不过万变不离其宗 在以后的学习中容易掌握,因为涉及范围广阔,使用率高.所以多加练习后会掌握. ————————for循环—————————— for循环概念: for循环编程语言中的语句之一,用于循环执行.for循环是开界的,它的一般形式为: for(; <<span se-mark="1">条件表达式>; ) 语句: 初始化总是一个赋值语句, 它用来给循环控制变量赋初值: 条件表达式是一个关系表达式, 它决定什么时候

iOS学习笔记6-GET POST方法

GET 在请求URL后面以?的形式跟上发给服务器的参数,多个参数之间用&隔开,比如http://ww.test.com/login?username=123&pwd=234&type=JSON 注意:由于浏览器和服务器对URL长度有限制,因此在URL后面附带的参数是有限制的,通常不能超过1KB POST 发给服务器的参数全部放在请求体中 理论上,POST传递的数据量没有限制(具体还得看服务器的处理能力) 选择GET和POST的建议 (1)如果要传递大量数据,比如文件上传,只能用PO

iOS学习笔记(5)形参个数可变的方法

如果在定义方法时,在最后一个形参明后增加逗号和三点(,...),则表明该形参可以接受多个参数值. 为了在程序中获取个数可变的形参,需要使用如下关键字 · va_list:这是一个类型,用于定义指向可变参数列表的指针变量 · va_start:这是一个函数,该函数指定开始处理可变形参的列表,并让指针变量指向可变形参列表的第一个参数 · va_end:结束处理可变形参,释放指针变量 · va_arg:该函数返回获取指针当前指向的参数的值,并将指针移动到指向下一个参数 例子 Varargs.h #im

iOS学习笔记-精华整理

iOS学习笔记总结整理 一.内存管理情况 1- autorelease,当用户的代码在持续运行时,自动释放池是不会被销毁的,这段时间内用户可以安全地使用自动释放的对象.当用户的代码运行告一段 落,开始等待用户的操作,自动释放池就会被释放掉(调用dealloc),池中的对象都会收到一个release,有可能会因此被销毁. 2-成员属性:     readonly:不指定readonly,默认合成getter和setter方法.外界毫不关心的成员,则不要设置任何属性,这样封装能增加代码的独立性和安全

iOS: 学习笔记, performSelectorOnMainThread

- (void)performSelectorOnMainThread:(SEL)aSelector withObject:(id)arg waitUntilDone:(BOOL)wait performSelectorOnMainThread:withObject:waitUntilDone: 基于默认模式调用主线程中接收器的方法 Invokes a method of the receiver on the main thread using the default mode. 参数 Par

iOS学习笔记之UITableViewController&amp;UITableView

iOS学习笔记之UITableViewController&UITableView 写在前面 上个月末到现在一直都在忙实验室的事情,与导师讨论之后,发现目前在实验室完成的工作还不足以写成毕业论文,因此需要继续思考新的算法.这是一件挺痛苦的事情,特别是在很难找到与自己研究方向相关的文献的时候.也许网格序列水印这个课题本身的研究意义就是有待考证的.尽管如此,还是要努力的思考下去.由于实验室的原因,iOS的学习进度明显受到影响,加之整理文档本身是一件耗费时间和精力的事情,因此才这么久没有写笔记了. M

IOS学习笔记 -- Modal和Quartz2D

一. Modal1.Modal的默认效果:新控制器从屏幕的最底部往上钻,直到盖住之前的控制器为止;Modal只是改变了View的现实,没有改变rootViewController 2.常用方法1>.以Modal的形式展示控制器- (void)presentViewController:(UIViewController *)viewControllerToPresent animated: (BOOL)flag completion:(void (^)(void))completion2>.关

iOS学习笔记(2)— UIView用户事件响应

iOS学习笔记(2)— UIView用户事件响应 UIView除了负责展示内容给用户外还负责响应用户事件.本章主要介绍UIView用户交互相关的属性和方法. 1.交互相关的属性 userInteractionEnabled 默认是YES ,如果设置为NO则不响应用户事件,并且把当前控件从事件队列中删除.也就是说设置了userInterfaceEnabled属性的视图会打断响应者链导致该view的subview都无法响应事件. multipleTouchEnabled  默认是NO,如果设置为YE