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

时间: 2024-08-01 22:43:55

IOS RunLoop浅析 一的相关文章

IOS RunLoop浅析 三

经过两篇的介绍我想对RunLoop应该有了简单的了解,至少不至于一无所知. 在这篇我想对"CFRunLoopObserverRef"做一下简单的补充. 在补充之前先说一下. 在现在的开发中已经很少见到MRC了. 但是那是对与OC对象的. CFRunLoopObserverRef属于CF (Core Foundation) 所以我们需要手动释放. 规则如下: 凡是带有creat copy retain 等成分的函数创建出来的对象都要要在最后进行释放,即Release. // // Vie

IOS RunLoop浅析 二

上一篇我们说了runloop 的几种模式,那么我们在模式中又要做些什么呢??? 模式中有三个模块: 事件源(输入源) Source Source: 按照官方文档分类 Port-Based Custom Input Cocoa Perform Selector 按照函数调用栈,Source的分类 Source0:非基于Port的 Source1:基于Port的,通过内核和其他线程通信,接受,分发系统事件. (这里没什么太大用,剩下的Source概念我就不介绍了有兴趣可以去别处查查) 观察者 Obs

iOS线程浅析

一.线程概述 1. iOS里面的线程按种类可分为同步线程和异步线程.同步线程指调用同步线程的地方必须等到同步线程执行完毕才可以继续向下执行.而调用异步线程的地方则在执行完调用异步线程的语句后就可以继续向下执行. 2.线程按调用方式又可以大致分为以下几种类型:NSObject.NSThread.NSOperation和GCD.NSObject和NSThread只能管理单个的线程,功能较简单,GCD和NSOperation则可以进行队列等复杂操作,且效率较高.其中GCD方式最为有效,NSOperat

iOS RunLoop了解和使用

RunLoop 上次讲了runtime,这次是runloop,虽然两者都是run开头的名词术语,但是在OC中,这两个东西压根没啥联系.这篇文章主要讲讲runloop的一些概念和用法.其中包含: 什么runloop runloop是怎么存在的 runloop中包含哪些东西 日常开发中使用到runloop 的场景 一.什么是runloop 一个很容易想到的现象: 当我们将手机解锁进入某个APP之后,如果不操作手机(包括网络请求的行为),手机不会有任何反应,一旦我们进行了操作的时候,手机就会执行响应的

iOS runloop详解

写这篇文章开始之前,我都不知道runloop是什么东西,如果从字面的意思翻译应该是一直循环的跑,怀疑可能和死锁有关系,可是死锁具体是怎么回事,我只是记得有这个说法,也发现了一个自己不懂的知识. 初识runloop 我在网上看了一下@sunnnyxx 关于runloop的视频.了解了一下runloop相关知识,也去网络上看各种关于runloop的讲述. 我们一般程序就是执行一个线程,是一条直线,有起点终点,而runloop就是一直在线程上面画圆圈,一直在跑圈,除非切断否则一直在运行.网上说的比喻很

iOS runloop 资源汇总-b

RunLoop 是 iOS 和 OSX 开发中非常基础的一个概念,这篇文章将从 CFRunLoop 的源码入手,介绍 RunLoop 的概念以及底层实现原理.之后会介绍一下在 iOS 中,苹果是如何利用 RunLoop 实现自动释放池.延迟回调.触摸事件.屏幕刷新等功能的. 1.先来一发,孙源大神的讲解视频:http://v.youku.com/v_show/id_XODgxODkzODI0.html(亮点:讲解通俗易懂,理解深刻) 2.孙源大神原文博客:http://www.code4app.

ios Runloop

一.概念:一个Runloop就是一个事件处理的循环,用来不停的调度工作和处理输入事件,使用runloop的目的是让你的线程在有工作的时候处于工作状态,没有工作的时候处于休眠状态. 一般来讲,一个线程一次只能执行一个任务,执行完成后线程就会退出.如果我们需要一个机制,让线程能随时处理事件但并不退出,通常的代码逻辑是这样的: 1 2 3 4 5 6 7 function loop() {     initialize();     do {         var message = get_nex

iOS Runloop理解

一.RunLoop的定义 当有持续的异步任务需求时,我们会创建一个独立的生命周期可控的线程.RunLoop就是控制线程生命周期并接收事件进行处理的机制. RunLoop是iOS事件响应与任务处理最核心的机制,它贯穿iOS整个系统. Foundation: NSRunLoopCore Foundation: CFRunLoop 核心部分,代码开源,C 语言编写,跨平台 二.目的 通过RunLoop机制实现省电,流畅,响应速度快,用户体验好 三.理解 进程是一家工厂,线程是一个流水线,Run Loo

iOS Runloop学习笔记

一.* what is run loop * 1.A run loop is an abstraction that (among other things) provides a mechanism to handle system input sources (sockets, ports, files, keyboard, mouse, timers, etc). Each NSThread has its own run loop, which can be accessed via t