码迷,mamicode.com
首页 > 其他好文 > 详细

浅谈一下对runloop的理解

时间:2016-08-11 12:57:59      阅读:167      评论:0      收藏:0      [点我收藏+]

标签:

一 什么是RunLoop?

从字面意思看就是运行循环,其实内部就是do-while循环,这个循环内部不断地处理各种任务(比 如Source,Timer,Observer)

一个线程对应一个RunLoop,主线程的RunLoop默认已经启动,子线程的RunLoop得手动启动(run方法)

RunLoop只能选择一个Mode启动,如果当前Mode中没有任何Source,Timer,Observer,那么就直接退出RunLoop 

 

二 你在开发过程中怎么使用RunLoop?什么应用场景?

开启一个常驻线程(让一个子线程不进入消亡状态,等待其他线程发来的消息,处理其他事件)

在子线程中开启一个定时器

在子线程中进行一些长期监控

可以控制定时器在特定模式下运行

可以让某些事件(行为,任务)在特定模式下执行

可以添加observer监听RunLoop的状态,比如监听点击事件的处理(比如在所有点击事件前做一些处理)

//下面用代码来介绍runloop在线程中的运用

我们的目的是开辟一个子线程处理一些事件,然后将另一件事也放到第一个线程中处理

#import "ViewController.h"

@interface ViewController ()

@property(nonatomic,strong)NSThread*thread;

@end

 @implementation ViewController

 

- (void)viewDidLoad {

    [super viewDidLoad];

       UIButton*but1=[UIButton buttonWithType:UIButtonTypeSystem];

    [but1 setFrame:CGRectMake(50, 50, 40, 30)];

    [but1 setBackgroundColor:[UIColor blueColor]];

    [but1 addTarget:self action:@selector(text1) forControlEvents:UIControlEventTouchUpInside];

    [self.view addSubview:but1];

   

    UIButton*but12=[UIButton buttonWithType:UIButtonTypeSystem];

    [but12 setFrame:CGRectMake(120, 50, 30, 30)];

    [but12 setBackgroundColor:[UIColor redColor]];

    [but12 addTarget:self action:@selector(text12) forControlEvents:UIControlEventTouchUpInside];

    [self.view addSubview:but12];

}

-(void)text1

{

    NSLog(@"%@",[NSThread currentThread]);

 

    self.thread=[[NSThread alloc]initWithTarget:self selector:@selector(text2) object:nil];

    [self.thread start];

  

}

-(void)text2

{

    //获得当前子线程对应的runloop,也就是说一个进程的开始就会开启一个runloop对象,对于子线程的runloop对象是需要手动开启的,需要调用run方法;

    NSRunLoop*runloop=[NSRunLoop currentRunLoop];

     NSLog(@"2%@",[NSThread currentThread]);

    //runloop的作用是为了保证线程的存活,这里的 NSTimer是保证runloop不退出,若没有runloop的运行模式的话,这个runloop就会自动退出,

    

//    //1第一种方法加定时器

//    NSTimer*timer=[NSTimer timerWithTimeInterval:2 target:self selector:@selector(too1 ) userInfo:nil repeats:YES];

//    [runloop addTimer:timer forMode:NSDefaultRunLoopMode];

//    

    

   //2.给runloop加一个端口,保证runloop不退出

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

      [runloop run];

}

//点击第二个红色按钮后继续让第一个线程继续工作

-(void)text12

{

 

    [self performSelector:@selector(text13) onThread:self.thread withObject:nil waitUntilDone:YES];//为了将其他的事件也在上一个线程中来执行,那么我们对上一个线程做了一个存活的处理,所以利用runloop来保证线程的存活,不让其退出;

 

}

-(void)text13

{

 NSLog(@"13%@",[NSThread currentThread]);

 

}

 

浅谈一下对runloop的理解

标签:

原文地址:http://www.cnblogs.com/wpw19920808/p/5760407.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!