iOS - OC RunLoop 运行循环/消息循环

简介: 1、RunLoop1)运行循环:运行循环在 iOS 开发中几乎不用,但是概念的理解却非常重要。同一个方法中的代码一般都在同一个运行循环中执行,运行循环监听 UI 界面的修改事件,待本次运行循环结束时,统一将界面的修改渲染出来。

1、RunLoop

  • 1)运行循环:

    • 运行循环在 iOS 开发中几乎不用,但是概念的理解却非常重要。

    • 同一个方法中的代码一般都在同一个运行循环中执行,运行循环监听 UI 界面的修改事件,待本次运行循环结束时,统一将界面的修改渲染出来。
    • 点击事件触发结束后立即结束本次运行循环。

    • 作用:

      • 保证程序不退出。
      • 负责监听所有事件,例如:手势触摸,时钟触发,网络加载数据完成等。
    • 特性:

      • 没有事件时,会休眠(省电),一旦监听到事件,会立即响应。
      • 每一个线程都有一个 runloop,但是只有主线程的 runloop 会默认启动。子线程的运行循环默认是不启动的。
  • 2)子线程运行循环:

    • 子线程的运行循环默认是不启动的。

    • 启动运行循环后,如果不停止运行循环,不会执行后续的任何代码,会形成一个死循环。

    • 一旦停止了运行循环,后续代码能够执行,执行完毕后,线程被自动销毁。

  • 3)响应者链条事件监听过程:

    RunLoop1

2、运行循环的使用

2.1 时钟调度

    /*
        - (void)addTimer:(NSTimer *)timer forMode:(NSString *)mode;
        
        NSDefaultRunLoopMode: 时钟,网络。           发生用户交互的时候,时钟会被暂停
        NSRunLoopCommonModes: 用户交互,响应级别高。   发生用户交互的时候,时钟仍然会触发,如果时钟触发方法非常耗时,
                                                   使用此方式时用户操作会造成非常严重的卡顿。
    */
  • 以 NSRunLoopCommonModes 方式创建

        // 调度时钟
        self.timer = [NSTimer timerWithTimeInterval:1.0 
                                             target:self 
                                           selector:@selector(updateTimer) 
                                           userInfo:nil 
                                            repeats:YES];
    
        // 将时钟以 NSRunLoopCommonModes 模式添加到运行循环
        [[NSRunLoop currentRunLoop] addTimer:self.timer forMode:NSRunLoopCommonModes];
  • 以 NSDefaultRunLoopMode 方式创建

        // 调度时钟
        /*
            默认将时钟以 NSDefaultRunLoopMode 模式添加到运行循环
        */
        self.timer = [NSTimer scheduledTimerWithTimeInterval:1.0 
                                                      target:self 
                                                    selector:@selector(updateTimer) 
                                                    userInfo:nil 
                                                     repeats:YES];
  • 子线程运行循环

        dispatch_async(dispatch_get_global_queue(0, 0), ^{
    
            // 在子线程开启时钟,由于子线程的运行循环没有启动,所以没法监听时钟事件
            self.timer = [NSTimer timerWithTimeInterval:1.0 
                                                 target:self 
                                               selector:@selector(updateTimer) 
                                               userInfo:nil 
                                                repeats:YES];
    
            [[NSRunLoop currentRunLoop] addTimer:self.timer forMode:NSDefaultRunLoopMode];
    
            // 启动子线程的运行循环,这句代码就是一个死循环!如果不停止运行循环,不会执行后续的任何代码
            CFRunLoopRun();
    
            // 停止子线程运行循环之前,不会执行添加到此处的任何代码
        });
    
        // 运行循环执行操作方法
        - (void)updateTimer {
    
            static int num = 0;
    
            NSLog(@"%d %@", num++, [NSThread currentThread]);
    
            // 满足条件后,停止当前的运行循环
            if (num == 8) {
    
                // 一旦停止了运行循环,后续代码能够执行,执行完毕后,线程被自动销毁
                CFRunLoopStop(CFRunLoopGetCurrent());
            }
        }
目录
相关文章
|
4月前
|
iOS开发
iOS实时查看App运行日志
iOS实时查看App运行日志
34 0
|
4月前
|
存储 监控 iOS开发
查看ios app运行日志
查看ios app运行日志
24 0
|
4月前
|
iOS开发
iOS实时查看App运行日志
在移动应用开发过程中,经常需要查看应用在运行时输出的日志信息。而在iOS上,我们可以通过克魔助手提供的功能来实现方便快捷地查看设备上的日志。本文将介绍如何使用克魔助手来实时查看iOS设备上的应用日志。
iOS实时查看App运行日志
|
8月前
|
Swift iOS开发
iOS OC混编Swift 后者无法走断点
iOS OC混编Swift 后者无法走断点
50 0
|
10月前
|
开发框架 Dart 开发工具
使用Flutter开发一套可同时运行在Android和iOS平台的代码
Flutter是一种跨平台移动应用开发框架,它允许开发者使用单一代码库构建高性能、美观且可在多个平台上运行的应用程序。本文将介绍如何使用Flutter开发一套同时适用于Android和iOS平台的代码。
|
11月前
|
Shell
(Mac)remotedebug-ios-webkit-adapter 无法运行,出现以下错误:ios_webkit_debug_proxy找不到。请安装 ios_webkit_debug_proxy (https://github.com/google/ios-webkit-debug-proxy) #74
(Mac)remotedebug-ios-webkit-adapter 无法运行,出现以下错误:ios_webkit_debug_proxy找不到。请安装 ios_webkit_debug_proxy (https://github.com/google/ios-webkit-debug-proxy) #74
418 0
|
12月前
|
开发工具 iOS开发
iOS 项目无法在模拟器运行解决办法
iOS 项目无法在模拟器运行解决办法
463 0
|
iOS开发 芯片 MacOS
macOS Big Sur 正式发布并已开放下载,支持原生运行 iOS 和 iPadOS App
macOS Big Sur 正式发布并已开放下载,支持原生运行 iOS 和 iPadOS App
156 0
|
iOS开发
ios实战-runloop实现的同步弹窗
我们知道UIAlertView使用delegate返回数据实现的,使用麻烦,之前介绍过用Block实现的例子《ios实战-使用Block的UIAlertView》 今天介绍使用runloop实现,用return返回点击的结果的方式
92 0
|
JavaScript 安全 Android开发
document.referrer在ios15.4.1无法运行正常
document.referrer在ios15.4.1无法运行正常
337 0