导航
当前位置:首页>>app
在线生成app,封装app

ios定时器封装

2023-11-25 围观 : 0次

iOS定时器封装(原理或详细介绍)

在iOS开发中,定时器是一项非常实用的功能,我们经常将它用于处理定时任务、动画效果等多种场景。在iOS系统中,有两种常用的定时器:NSTimer和CADisplayLink。本文将详细介绍这两种定时器的原理和封装方法,帮助你更好地理解和应用定时器。

一、NSTimer

1. 原理

NSTimer是Foundation框架中提供的一个定时器类,基于RunLoop实现,用于在指定的时间间隔内重复执行某些操作。NSTimer定时器在运行循环RunLoop中被调度,只有当RunLoop运行时,定时器才会生效。

2. 封装

在使用NSTimer时,需要注意避免循环引用问题。这里我们采用block实现定时器,使其使用更加方便。

下面是一个封装好的NSTimer分类:

```

@interface NSTimer (BlockTimer)

+ (NSTimer *)blockTimerWithTimeInterval:(NSTimeInterval)timeInterval

repeats:(BOOL)repeats

userInfo:(id)userInfo

block:(void (^)(NSTimer *timer))block;

@end

@implementation NSTimer (BlockTimer)

+ (NSTimer *)blockTimerWithTimeInterval:(NSTimeInterval)timeInterval

repeats:(BOOL)repeats

userInfo:(id)userInfo

block:(void (^)(NSTimer *))block {

return [NSTimer timerWithTimeInterval:timeInterval

target:self

selector:@selector(timerFired:)

userInfo:@[block]

repeats:repeats];

}

+ (void)timerFired:(NSTimer *)timer {

void (^block)(NSTimer *timer) = timer.userInfo[0];

if (block) {

block(timer);

}

}

@end

```

使用示例:

```

NSTimer *timer = [NSTimer blockTimerWithTimeInterval:1.0

repeats:YES

userInfo:nil

block:^(NSTimer *timer) {

NSLog(@"定时器执行");

}];

[[NSRunLoop currentRunLoop] addTimer:timer forMode:NSRunLoopCommonModes];

```

二、CADisplayLink

1. 原理

CADisplayLink是一个与屏幕刷新率同步的定时器,属于QuartzCore框架。CADisplayLink运行在一个与显示帧率同步的周期中,可以保持用户界面的动画效果更加流畅。当一帧屏幕刷新时,该定时器会调用指定的方法。

2. 封装

同样地,我们采用block封装CADisplayLink,以减少循环引用的风险。

下面是一个封装好的CADisplayLink分类:

```

@interface CADisplayLink (BlockDisplayLink)

+ (CADisplayLink *)blockDisplayLinkWithBlock:(void (^)(CADisplayLink *displayLink))block;

@end

@implementation CADisplayLink (BlockDisplayLink)

+ (CADisplayLink *)block_displayLinkWithTargetProxy:(id)proxy selector:(SEL)sel {

return [CADisplayLink displayLinkWithTarget:proxy selector:sel];

}

+ (CADisplayLink *)blockDisplayLinkWithBlock:(void (^)(CADisplayLink *))block {

CADisplayLinkTargetProxy *proxy = [[CADisplayLinkTargetProxy alloc] initWithBlock:block];

return [self block_displayLinkWithTargetProxy:proxy selector:@selector(displayLinkDidUpdate:)];

}

@end

@interface CADisplayLinkTargetProxy : NSObject

@property (nonatomic, copy) void (^updateBlock)(CADisplayLink *displayLink);

@end

@implementation CADisplayLinkTargetProxy

- (instancetype)initWithBlock:(void (^)(CADisplayLink *))updateBlock {

self = [super init];

if (self) {

_updateBlock = [updateBlock copy];

}

return self;

}

- (void)displayLinkDidUpdate:(CADisplayLink *)displayLink {

if (self.updateBlock) {

self.updateBlock(displayLink);

}

}

@end

```

使用示例:

```

CADisplayLink *displayLink = [CADisplayLink blockDisplayLinkWithBlock:^(CADisplayLink *displayLink) {

NSLog(@"CADisplayLink执行");

}];

[displayLink addToRunLoop:[NSRunLoop currentRunLoop] forMode:NSRunLoopCommonModes];

```

总结

在iOS开发中,不同场景下可以选择使用不同的定时器。对于一般的定时任务,我们可以选择NSTimer;对于需要更加精确且与屏幕刷新率同步的任务,可以选择CADisplayLink。通过本文的封装,我们可以更方便地应用这两种定时器,更好地满足开发需求。

相关文章
  • h5打包成app支持sdk支付

    将H5网页打包成App并支持SDK支付是一种常见的做法,可以帮助企业快速推出移动应用程序,并为用户提供更加便捷的支付方式。下面我们将介绍H5打包成App支持SDK支付的原理和详细步骤。一、原理介绍H5打包成App支持SDK支付的原理是将H5网页嵌入到原生App中,并通过调用SDK实现支付功能。具体来...

    2023-10-12
  • app封装上架

    随着智能手机的普及,APP(应用程序)在人们的生活中越来越重要。为了让广大用户更好地使用自己的应用程序,开发者需要将APP进行封装、上架,使其在苹果、安卓等主流应用市场中被检索到。那么,关于APP封装与上架,您需要了解哪些原理和细节呢?明白这些内容,不仅能让您更好地掌握APP开发与上线的全过程,还能...

    2023-11-24
  • 做差差事的软件app大全网页版

    做差差事软件指的是一类可以让用户通过手机等工具轻松挣钱的应用程序。这类软件可以让用户完成简单的任务,比如回答问卷调查、下载试玩游戏、拍照片、打卡等等,完成任务后就可以获得相应的报酬。这里介绍一些常用的做差差事软件。1. 悦跑圈悦跑圈是一款运动类软件,用户可以通过它参与类似“打卡”、“签到”等简单的活...

    2023-10-28
  • apple 开发网络权限

    在苹果开发中,网络权限是一项非常重要的安全措施。网络权限是指应用程序请求、访问和使用网络服务的能力。这些服务可能包括互联网上的服务器、邮件、网络摄像机等等。网络权限是苹果开发中的一项核心功能,它可以有助于保护用户的隐私和安全。苹果开发提供多种网络权限选项,包括网络通信权限、网络浏览权限、以及定位权限...

    2023-11-09
  • app编写开发网站

    App的编写开发需要从几个方面入手,包括基础的技术储备、开发环境的搭建、应用程序的设计与实现等方面。一、技术储备在进行App的开发之前,需要有一定的代码技术储备,熟悉至少变色龙编程语言,并且了解可用的开发工具与开发平台,如Java语言、Xcode平台等等。此外还需要了解App开发的特点,例如使用的数...

    2023-11-24