iOS开发RunLoop学习:三:Runloop相关类(source和Observer)

一:RunLoop相关类:

其中:source0指的是非基于端口por,说白了也就是处理触摸事件,selector事件,source1指的是基于端口的port:是处理系统的一些事件

注意:创建一个RunLoop之后,有默认的运行模式mode,也可以为RunLoop指定运行模式,RunLoop启动必须得有运行模式,而且在运行模式中必须还有timer或是source事件其中之一,否则RunLoop就会退出。启动RunLoop必须调用start方法

二:RunLoop运行处理逻辑

RunLoop通知观察者Observer即将进入RunLoop,此时通知观察者Observer处理Timer,通知观察者Observer处理source0(非基于端口port,也就是触摸,滚动,selector选择器事件),此时RunLoop会处理source0事件,当处理完source0事件后,如果此时没有source1(系统事件)则RunLoop进入休眠状态,直到外部的source0,timer或是外部手动唤醒RunLoop,若是此时有source1事件,则会处理唤醒时受到的消息,之后再继续跳回2--处理timer--处理source0--在检查有无source1 ,RunLoop就是一个死循环,最后如果线程被挂掉(也就是线程中的任务执行完毕后,线程就会挂掉,即使使用外部强引用指向该线程,线程依然会挂掉,若是想使线程执行完任务后,不被挂掉,则可以手动开启RunLoop,为RunLoop指定运行模式mode,在mode中必须为RunLoop指定source或是timer,否则RunLoop会立即退出,)会通知Observer即将退出RunLoop

2:苹果官方版

#import "ViewController.h"

/**
 *    1:为RunLoop添加监听者:1:先创建监听者  2:添加监听者
 */

@interface ViewController ()
/** 注释 */
//@property (nonatomic, strong) pthread_t thread;
@end

@implementation ViewController

#pragma mark ----------------------
#pragma mark Events
-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
//    [self observer];
//    [NSTimer scheduledTimerWithTimeInterval:2.0 target:self selector:@selector(task) userInfo:nil repeats:YES];

    [NSThread detachNewThreadSelector:@selector(task) toTarget:self withObject:nil];
}

- (IBAction)sourceBtnClick:(id)sender
{
    NSLog(@"%s",__func__);
}

#pragma mark ----------------------
#pragma mark
-(void)task
{
    NSLog(@"%s",__func__);

//    [NSRunLoop currentRunLoop] runUntilDate:[];
}

-(void)observer
{
    //1.创建监听者
    /*
     第一个参数:怎么分配存储空间
     第二个参数:要监听的状态 kCFRunLoopAllActivities 所有的状态
     第三个参数:时候持续监听
     第四个参数:优先级 总是传0
     第五个参数:当状态改变时候的回调
     */
    CFRunLoopObserverRef observer = CFRunLoopObserverCreateWithHandler(CFAllocatorGetDefault(), kCFRunLoopAllActivities, YES, 0, ^(CFRunLoopObserverRef observer, CFRunLoopActivity activity) {

        /*
         kCFRunLoopEntry = (1UL << 0),        即将进入runloop
         kCFRunLoopBeforeTimers = (1UL << 1), 即将处理timer事件
         kCFRunLoopBeforeSources = (1UL << 2),即将处理source事件
         kCFRunLoopBeforeWaiting = (1UL << 5),即将进入睡眠
         kCFRunLoopAfterWaiting = (1UL << 6), 被唤醒
         kCFRunLoopExit = (1UL << 7),         runloop退出
         kCFRunLoopAllActivities = 0x0FFFFFFFU
         */
        switch (activity) {
            case kCFRunLoopEntry:
                NSLog(@"即将进入runloop");
                break;
            case kCFRunLoopBeforeTimers:
                NSLog(@"即将处理timer事件");
                break;
            case kCFRunLoopBeforeSources:
                NSLog(@"即将处理source事件");
                break;
            case kCFRunLoopBeforeWaiting:
                NSLog(@"即将进入睡眠");
                break;
            case kCFRunLoopAfterWaiting:
                NSLog(@"被唤醒");
                break;
            case kCFRunLoopExit:
                NSLog(@"runloop退出");
                break;

            default:
                break;
        }
    });

    /*
     第一个参数:要监听哪个runloop
     第二个参数:观察者
     第三个参数:运行模式
     */
    CFRunLoopAddObserver(CFRunLoopGetCurrent(),observer, kCFRunLoopDefaultMode);

    //NSDefaultRunLoopMode == kCFRunLoopDefaultMode
    //NSRunLoopCommonModes == kCFRunLoopCommonModes
}

@end
时间: 2024-10-06 08:50:43

iOS开发RunLoop学习:三:Runloop相关类(source和Observer)的相关文章

ios开发网络学习三:NSURLConnection小文件大文件下载

一:小文件下载 #import "ViewController.h" @interface ViewController ()<NSURLConnectionDataDelegate> /** 注释 */ @property (nonatomic, strong) NSMutableData *fileData; @property (nonatomic, assign) NSInteger totalSize; @property (weak, nonatomic) IB

关于iOS开发的学习

关于iOS开发的学习,打个比方就像把汽车分解:    最底层的原料有塑料,钢铁    再用这些底层的东西造出来发动机,座椅    最后再加上写螺丝,胶水等,把汽车就拼起来了iOS基本都是英文的资料,也由于封闭,文档写的相当好.在遇到新框架的时候:    弄明白框架的功能    去文档里搜搜 框架的 Programming Guide 很有用    要弄明白框架类的继承结构写iOS的程序不一定都是用OBJC,很多框架是用C写的.学习iOS开发基础可以按照下面两个方面学:    基础 (原料 钢铁 

iOS开发项目篇—21抽取工具类

iOS开发项目篇—21抽取工具类 一.抽取宏 把和应用相关的信息抽取出来 App Key:1972915028 App Secret:b255603c4dfd82b4785bf9a808ce2662 回调地址:http://www.cnblogs.com/wendingding/ (1)appkey和回调页面在很多地方都要用到 (2)如果是不同应用的话,只需要把这几个参数换掉就可以了.把它们抽取成一个宏,写到pch文件中. 项目的PCH文件 1 #import <Availability.h>

iOS开发如何学习前端(1)

iOS开发如何学习前端(1) 我为何学前端?因为无聊. 概念 前端大概三大块. HTML CSS JavaScript 基本上每个概念在iOS中都有对应的.HTML请想象成只能拉Autolayout或者设置Frame的ViewController.好比你在网页上放了一个Button,如果用HTML你就可以设置他的摆放位置,在哪哪个控件里.但是你不可以设置大小,颜色,圆角之类的属性.CSS专门负责HTML管不了的这些颜色啊,大小啊之类的属性.JavaScript主要负责响应事件,你把它想象成iOS

iOS开发UINavigation系列三——工具栏UIToolBar

iOS开发UINavigation系列三--工具栏UIToolBar iOS中除了UINavinationBar之外,还有工具栏UIToolBar可以供我们使用,工具栏和导航栏十分类似,只是功能更加简单,工具栏中也有UIBarButtonItem按钮,在前两篇博客中,对导航栏和导航项都进行的讨论,地址如下: UINavigationBar:http://my.oschina.net/u/2340880/blog/527706 UINavigationItem:http://my.oschina.

IOS开发---菜鸟学习之路--(二)-数据获取

http://www.cnblogs.com/PleaseInputEnglish/p/3432024.html IOS开发---菜鸟学习之路--(二)-数据获取,布布扣,bubuko.com

0811 iOS开发需要学习哪些内容

1.iOS开发需要学习哪些内容? 2.开发步骤 3.框架 为了方便开发者开发出强大的功能,苹果提供了各种各样的框架 [1]UIKit:创建和管理应用程序的用户界面 [2]QuartzCore:提供动画特效以及通过硬件进行渲染的能力 [3]CoreGraphics:提供2D绘制的基于C的API [4]CoreLocation:使用GPS和WIFI获取位置信息 [5]MapKit:为应用程序提供内嵌地图的接口 [6]AVFoundation:音频.视频处理 [7]--

ios开发Base64编码以及加密相关学习

一:.Base64补充 ```objc 1.Base64简单说明 描述:Base64可以成为密码学的基石,非常重要. 特点:可以将任意的二进制数据进行Base64编码 结果:所有的数据都能被编码为并只用65个字符就能表示的文本文件. 65字符:A~Z a~z 0~9 + / = 对文件进行base64编码后文件数据的变化:编码后的数据~=编码前数据的4/3,会大1/3左右. 2.命令行进行Base64编码和解码 编码:base64 123.png -o 123.txt 解码:base64 123

iOS开发架构学习记录

闲着没事看了一些iOS开发架构的视频,简单的介绍了几个常用的架构设计,现将它记录如下,以后有时间再专门写这方面的内容,大家可以看看,感兴趣的就进一步学习. 一.架构基础 1.架构设计的目的 进一步解耦. 2.耦合的方式 1)单例-彼此知道对方的存在 2)delegate-被委托方不知道委托方的存在,委托方知道被委托方的存在 3)通知-双方都不知道对方的存在 二.MVC C可以控制V的渲染,C可以修改M. V可以将用户这边采集到的数据和用户事件反馈给C做进一步的处理,V可以读取到M中的数据进而展示

iOS开发之使用Runtime给Model类赋值

本篇博客算是给网络缓存打个基础吧,本篇博客先给出简单也是最容易使用的把字典转成实体类的方法,然后在给出如何使用Runtime来给Model实体类赋值.本篇博客会介绍一部分,主要是字典的key与Model的属性名相同时,使用Runtime来进行赋值,下篇博客会给出字典key的值和Model的名字不同时的解决方案,并给出使用Runtime打印实体类属性值的方式. 当然你可以使用KVC的setValuesForKeysWithDictionary:方法,下面的方法也是一种解决方案.如果使用setVal