ios基础篇(六)—— 代理协议消息传递机制、 NSTimer计时器

el/2023/6/4 15:21:45

代理协议机制在iOS开发中,是非常常用的一种消息传递机制,主要用于子视图向父视图传递数据,代理协议是单向消息传递。

要使用代理协议,需要以下几个步骤:

  1.子视图控制器中需要做如下操作:

1.1在子视图控制器中定义协议,并且定义若干协议方法,注意:只有方法,而没有方法的具体实现。协议的名称通常是子视图控制器的类名+Delegate

@protocol GameViewControllerDelegate <NSObject>
- (void)gameOverDeliverTimer:(NSString *)timer;  
@end

1.2在子视图控制器中定义代理属性,代理的属性是weak

@property (weak, nonatomic) id <GameViewControllerDelegate> delegate;

子视图控制器中,在需要时直接通过_delegate调用协议方法,就可以执行父视图控制器中的相应方法的实现,在父视图中没有设置代理的话该方法是不起作用的:

[_delegate gameOverDeliverTimer:_timerLabel.text]

2.父视图控制器中需要做如下操作:

2.1 遵从子视图控制器头文件中定义的协议:<GameViewControllerDelegate>

2.2 在推出子视图控制器前,设置自己是子视图控制器的代理,通常在prepareSegue方法中实现

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{GameViewController *controller = [segue destinationViewController];  controller.delegate = self;
}

2.3 实现子视图控制器中的协议方法,等待子视图控制器的调用

- (void)gameOverDeliverTimer:(NSString *)timer{NSLog(@"最佳成绩:%@秒", timer);
}

NNSTimer计时器

使用实例代码如下:

// 第一个参数:多长时间会触发一次,以秒为单位

// 第二个参数:如果看到函数的参数有target,一般情况下,都用self

// 第三个参数:SEL,需要调用其他的方法,就是每次时钟被触发的时候,去执行的方法

// 最多可以带一个参数,就是时钟本身

// 第四个参数,暂时不用考虑,设置成nil

// 第五个参数:是否重复,通常会设置YES

_gameTimer = [NSTimer scheduledTimerWithTimeInterval:1.0f target:self selector:@selector(updateTimer:) userInfo:nil repeats:YES];

在时钟触发方法中,可以使用sender.fireDate获取到时钟被触发的时间

注意:使用NSTimer的时候,千万不要忘记调用invalidate方法关闭时钟。

NSTimer可能不会是及时相应触发时间的,它的执行优先级相对较低,因此,不要使用NSTimer去做实时响应需求较高的周期性操作。

//NSTimer
-(void)createTimer{  //初始化//_timer = [NSTimer scheduledTimerWithTimeInterval:1.0 repeats:YES block:^(NSTimer * _Nonnull timer) {//执行操作//}];    _timer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(timerStart:) userInfo:nil repeats:YES];    //加入runloop循环池[[NSRunLoop mainRunLoop] addTimer:_timer forMode:NSDefaultRunLoopMode];//开启定时器[_timer fire];
}
-(void)timerStart:(NSTimer *)timer{NSLog(@"%s-----%lf",__func__,timer.timeInterval);//销毁定时器//[_timer invalidate];//_timer = nil;
}
解释:
  • TimerInterval: 执行之前等待的时间。比如设置成1.0,就代表1秒后执行方法
  • target: 需要执行方法的对象。
  • selector : 需要执行的方法
  • repeats : 是否需要循环

注意 :
调用创建方法后,target对象的计数器会加1,直到执行完毕,自动减1。如果是循环执行的话,就必须手动关闭,否则可以不执行释放方法。

特性:

  • 存在延迟
  • 不管是一次性的还是周期性的timer的实际触发事件的时间,都会与所加入的RunLoop和RunLoop Mode有关,如果此RunLoop正在执行一个连续性的运算,timer就会被延时出发。重复性的timer遇到这种情况,如果延迟超过了一个周期,则会在延时结束后立刻执行,并按照之前指定的周期继续执行。
  • 必须加入Runloop

使用上面的创建方式,会自动把timer加入MainRunloop的NSDefaultRunLoopMode中。

如果使用以下方式创建定时器,就必须手动加入Runloop: 

NSTimer *timer = [NSTimer timerWithTimeInterval:5 target:self selector:@selector(timerAction) userInfo:nil repeats:YES];
[[NSRunLoop mainRunLoop] addTimer:timer forMode:NSDefaultRunLoopMode];

 

http://www.ngui.cc/el/3419354.html

相关文章

ios基础篇(三)—— UITextField、UITextView

一、UITextField —— 文本框控件 作用&#xff1a;供用户输入或编辑文本 属性&#xff1a; text属性&#xff1a;获得或设置文本框中的文字 使用文本框控件时需要注意几项事情&#xff1a; 在输入不同类型的文本时&#xff0c;需要注意键盘的类型&#xff0c;譬如输入QQ号…

ios基础篇(五)—— UIDatePicker UIPickerView、UIPageControl、UIActivityIndicatorView

一、UIDatePicker && UIPickerView UIDatePicker&#xff08;日期选择器&#xff09;只有这四种模式&#xff1a; typedef NS_ENUM(NSInteger, UIDatePickerMode) {UIDatePickerModeTime, // Displays hour, minute, and optionally AM/PM designation …

ios基础篇(四)—— Foundation框架

凡是带有Mutable字样的类型&#xff0c;都是可变的&#xff0c;如果存在相对应的没有Mutable字样的类型&#xff0c;都是不可变的&#xff0c;一旦初始化之后&#xff0c;就不可以再修改。 一、NSString和NSMutableString 1.1 字符串转数字 integerValue 1.2 字符串常用方法…

小项目(一)—— QQ框架 UITabBarController静态单元格、Modal

UITabBarController 跟UINavigationController类似&#xff0c;UITabBarController也可以轻松地管理多个控制器&#xff0c;轻松完成控制器之间的切换&#xff0c;典型例子就是QQ、微信等应用 UITabBarController的简单使用 UITabBarController的使用步骤 初始化UITabBarCon…

ios基础篇(五)—— Quartz2D

一、Quartz2D Quartz 2D是一个二维绘图引擎&#xff0c;同时支持iOS和Mac OS X系统&#xff08;跨平台&#xff0c;纯 C 语言的&#xff09;。包含在 Core Graphics 框架中。 Quartz 2D能完成的工作 绘制图形 : 线条\三角形\矩形\圆\弧等 绘制文字 微博图片上的水印绘制\生…

ios基础篇(六)—— Quartz2D 饼状图、柱状图

一、绘制“饼状图” 思路&#xff1a; 构建数据&#xff0c;NSArray *data [30, 15, 5, 17, 3, 10, 20];。根据数据个数绘制“扇形”&#xff08;弧&#xff09; 注意&#xff1a; 每个弧的起始、结束弧度都是不一样的 每次绘制完毕一个弧以后都要重新设置下一次的起始弧度…

ios基础篇(七)—— 矩阵操作、图形上下文栈、Quartz2D的内存管理、绘制、图片裁剪

一、矩阵操作 - 仿射变换 缩放 void CGContextScaleCTM(CGContextRef c, CGFloat sx, CGFloat sy)旋转 void CGContextRotateCTM(CGContextRef c, CGFloat angle)平移 void CGContextTranslateCTM(CGContextRef c, CGFloat tx, CGFloat ty) #import "HMView.h"impl…

ios基础篇(九)—— 手势识别

UIGestureRecognizer: 手势识别器 能轻松识别用户在某个view上面做的一些常见手势 UIGestureRecognizer 是一个抽象类,定义了所有手势的基本行为&#xff0c;使用它的子类才能处理具体的手势 UIPanGestureRecognizer&#xff08;拖动&#xff09; UIPinchGestureRecognizer&a…

ios基础篇(十)—— CALayer基本属性

在iOS中&#xff0c;你能看得见摸得着的东西基本上都是UIView&#xff0c;比如一个按钮、一个文本标签、一个文本输入框、一个图标等等&#xff0c;这些都是UIView其实UIView之所以能显示在屏幕上&#xff0c;完全是因为它内部的一个图层 在创建UIView对象时&#xff0c;UIView…

ios基础篇(十.一)—— 动画

CADisplayLink CADisplayLink是一种以屏幕刷新频率触发的时钟机制&#xff0c;每秒钟执行大约60次左右 CADisplayLink是一个计时器&#xff0c;可以使绘图代码与视图的刷新频率保持同步&#xff0c;而NSTimer无法确保计时器实际被触发的准确时间 使用方法&#xff1a; 定义…