IOS RunLoop浅析 一

Posted 旭宝爱吃鱼

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了IOS RunLoop浅析 一相关的知识,希望对你有一定的参考价值。

RunLoop犹如其名循环。

RunLoop 中有多重模式。

在一个“时刻”只能值执行一种模式。

因此在使用RunLoop时要注意所实现的效果有可能不是你想要的。

在这里用NSTimer展示一下Runloop的简单实现。

在故事板中添加一个TextView(用于测试)

 技术分享

我们吧nstimer加入到NSDefaultRunLoopMode模式中

 技术分享

在上面我们可以很清晰的看到,当我们滚动TextView的时候,nstimer不在执行。

//
//  ViewController.m
//  CX RunLoop浅析
//
//  Created by ma c on 16/3/29.
//  Copyright © 2016年 xubaoaichiyu. All rights reserved.
//

#import "ViewController.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];

}

-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
    NSTimer * timer = [NSTimer timerWithTimeInterval:3 target:self selector:@selector(test) userInfo:nil repeats:YES];
    //添加到默认的runloop中
    [[NSRunLoop mainRunLoop]addTimer:timer forMode:NSDefaultRunLoopMode];
    
    [timer fire];
}
                       
-(void)test{

    NSLog(@"旭宝爱吃鱼");
    
}

@end

我们吧nstimer加入到UITrackingRunLoopMode模式中

 技术分享

在上面我们可以很清晰的看到,当我们滚动TextView的时候,nstimer执行。

//
//  ViewController.m
//  CX RunLoop浅析
//
//  Created by ma c on 16/3/29.
//  Copyright © 2016年 xubaoaichiyu. All rights reserved.
//

#import "ViewController.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];

}

-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
    NSTimer * timer = [NSTimer timerWithTimeInterval:3 target:self selector:@selector(test) userInfo:nil repeats:YES];
    //添加到默认的runloop中
    [[NSRunLoop currentRunLoop]addTimer:timer forMode:UITrackingRunLoopMode];
    
    [timer fire];
}
                       
-(void)test{

    NSLog(@"旭宝爱吃鱼");
    
}

@end

我们吧nstimer加入到NSRunLoopCommonModes模式中

 技术分享

在上面我们可以很清晰的看到,当我们滚动与不滚动TextView的时候,nstimer都执行。

//
//  ViewController.m
//  CX RunLoop浅析
//
//  Created by ma c on 16/3/29.
//  Copyright © 2016年 xubaoaichiyu. All rights reserved.
//

#import "ViewController.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];

}

-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
    NSTimer * timer = [NSTimer timerWithTimeInterval:3 target:self selector:@selector(test) userInfo:nil repeats:YES];
    //添加到默认的runloop中
    [[NSRunLoop currentRunLoop]addTimer:timer forMode:NSRunLoopCommonModes];
    
    [timer fire];
}
                       
-(void)test{

    NSLog(@"旭宝爱吃鱼");
    
}

@end

NSTimer * timer = [NSTimer scheduledTimerWithTimeInterval:2 target:self selector:@selector(test) userInfo:nil repeats:YES];

自动添加到runloop 并且默认为NSDefaultRunLoopMode.

但是我们可以通过与上面相同的方法改变模式。

技术分享

//
//  ViewController.m
//  CX RunLoop浅析
//
//  Created by ma c on 16/3/29.
//  Copyright © 2016年 xubaoaichiyu. All rights reserved.
//

#import "ViewController.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];

}

-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
    NSTimer * timer = [NSTimer scheduledTimerWithTimeInterval:2 target:self selector:@selector(test) userInfo:nil repeats:YES];
}
                       
-(void)test{
 
    NSLog(@"旭宝爱吃鱼");
    
}

@end

 

以上是关于IOS RunLoop浅析 一的主要内容,如果未能解决你的问题,请参考以下文章

IOS RunLoop浅析 二

IOS RunLoop浅析 三

IOS RunLoop浅析 二

IOS RunLoop浅析 三

RunLoop总结:RunLoop的应用场景

iOS 常见面试题--runloop