zoukankan      html  css  js  c++  java
  • iOS

    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());
      		}
      	}
      
  • 相关阅读:
    SpringCloud微服务基础学习
    EF6 + MySql 建立项目引用失败
    Forword(请求转发)与Redirect(重定向)区别
    Java 中 Hashtable与HashMap的区别
    cookie和session
    configparser模块的简单使用
    列表中的陷阱
    Python3面向对象编程总结
    Python---RabbitMQ的使用
    Django的template自定义函数的创建和使用
  • 原文地址:https://www.cnblogs.com/QianChia/p/5782964.html
Copyright © 2011-2022 走看看