iOS模块详解NSRunLoopiOS技术专题

NSRunloop简单细说(一)—— 整体了解

2017-08-22  本文已影响164人  刀客传奇

版本记录

版本号 时间
V1.0 2017.08.22

前言

NSRunloopOC Foundation框架中非常重要的一个类,很多时候我们会使用它,但是未必对其有深入的了解,接下来几篇我就会带着大家重新学习一下NSRunloop这个类,从简单到复杂,从基本到深化,我会一步步的走完。希望对大家有所帮助。具体可以参考苹果的开发文档

NSRunloop基本了解

Runloop即运行循环。NSRunloop是对CFRunloop的封装,为什么你的APP放在那里不去动它,在某个时间点去操作它,它还会给你反馈。就是因为Runloop的存在,因为Runloop的存在,保证你的程序不会死。具体可以参见苹果开发文档。也可以在xcode里面下载。具体可参照下图。

开发文档下载

安装好了以后大家可以从下面的路径/Applications/Xcode.app/Contents/Developer/Documentation/DocSets查看,具体如下图所示。

文档路径

至于开发文档的使用后面会单独抽出来一篇和大家详细说明。

使用command + shift + 0快捷键出来的文档,大家也可以参考。

NSRunloop的本质

NSRunloop是对CFRunloop的封装。

构成元素

NSRunloop主要作用

NSRunloop主要有以下作用:

依赖NSRunloop的类和框架

NSRunloop消息类型

下面我们看一下消息类型,其实就是很经典那个图。

NSRunloop消息类型

NSRunloop API文档

下面我们就看一下苹果给我们预留的API文档。

#import <Foundation/NSObject.h>
#import <Foundation/NSDate.h>
#import <CoreFoundation/CFRunLoop.h>

@class NSTimer, NSPort, NSArray<ObjectType>, NSString;

NS_ASSUME_NONNULL_BEGIN

FOUNDATION_EXPORT NSRunLoopMode const NSDefaultRunLoopMode;
FOUNDATION_EXPORT NSRunLoopMode const NSRunLoopCommonModes NS_AVAILABLE(10_5, 2_0);

//这里是NSRunLoop本类
@interface NSRunLoop : NSObject {
@private
    id          _rl;
    id          _dperf;
    id          _perft;
    id          _info;
    id          _ports;
    void        *_reserved[6];
}

#if FOUNDATION_SWIFT_SDK_EPOCH_AT_LEAST(8)
@property (class, readonly, strong) NSRunLoop *currentRunLoop;
@property (class, readonly, strong) NSRunLoop *mainRunLoop NS_AVAILABLE(10_5, 2_0);
#endif

@property (nullable, readonly, copy) NSRunLoopMode currentMode;

- (CFRunLoopRef)getCFRunLoop CF_RETURNS_NOT_RETAINED;

- (void)addTimer:(NSTimer *)timer forMode:(NSRunLoopMode)mode;

- (void)addPort:(NSPort *)aPort forMode:(NSRunLoopMode)mode;
- (void)removePort:(NSPort *)aPort forMode:(NSRunLoopMode)mode;

- (nullable NSDate *)limitDateForMode:(NSRunLoopMode)mode;
- (void)acceptInputForMode:(NSRunLoopMode)mode beforeDate:(NSDate *)limitDate;

@end

//这里是NSRunLoop其中的一个分类NSRunLoopConveniences
@interface NSRunLoop (NSRunLoopConveniences)

- (void)run; 
- (void)runUntilDate:(NSDate *)limitDate;
- (BOOL)runMode:(NSRunLoopMode)mode beforeDate:(NSDate *)limitDate;

#if (TARGET_OS_MAC && !(TARGET_OS_EMBEDDED || TARGET_OS_IPHONE))
- (void)configureAsServer NS_DEPRECATED(10_0, 10_5, 2_0, 2_0);
#endif

/// Schedules the execution of a block on the target run loop in given modes.
/// - parameter: modes   An array of input modes for which the block may be executed.
/// - parameter: block   The block to execute
- (void)performInModes:(NSArray<NSRunLoopMode> *)modes block:(void (^)(void))block API_AVAILABLE(macosx(10.12), ios(10.0), watchos(3.0), tvos(10.0));

/// Schedules the execution of a block on the target run loop.
/// - parameter: block   The block to execute
- (void)performBlock:(void (^)(void))block API_AVAILABLE(macosx(10.12), ios(10.0), watchos(3.0), tvos(10.0));

@end

/****************   Delayed perform  ******************/
@interface NSObject (NSDelayedPerforming)

- (void)performSelector:(SEL)aSelector withObject:(nullable id)anArgument afterDelay:(NSTimeInterval)delay inModes:(NSArray<NSRunLoopMode> *)modes;
- (void)performSelector:(SEL)aSelector withObject:(nullable id)anArgument afterDelay:(NSTimeInterval)delay;
+ (void)cancelPreviousPerformRequestsWithTarget:(id)aTarget selector:(SEL)aSelector object:(nullable id)anArgument;
+ (void)cancelPreviousPerformRequestsWithTarget:(id)aTarget;

@end

//这里是NSRunLoop其中的一个分类NSOrderedPerform
@interface NSRunLoop (NSOrderedPerform)

- (void)performSelector:(SEL)aSelector target:(id)target argument:(nullable id)arg order:(NSUInteger)order modes:(NSArray<NSRunLoopMode> *)modes;
- (void)cancelPerformSelector:(SEL)aSelector target:(id)target argument:(nullable id)arg;
- (void)cancelPerformSelectorsWithTarget:(id)target;

@end

从这个API文档上我们可以看见,提供的是一个本类,两个分类(NSRunLoopConveniencesNSOrderedPerform)。下面以表格的形式给出。

模块 内容
获取Runloop及其模式 @property(class, readonly, strong) NSRunLoop *currentRunLoop;
@property(readonly, copy) NSRunLoopMode currentMode;
- (NSDate *)limitDateForMode:(NSRunLoopMode)mode;
@property(class, readonly, strong) NSRunLoop *mainRunLoop;
- (CFRunLoopRef)getCFRunLoop;
定时器管理 - (void)addTimer:(NSTimer *)timer forMode:(NSRunLoopMode)mode;
端口Ports管理 - (void)addPort:(NSPort *)aPort forMode:(NSRunLoopMode)mode;
- (void)removePort:(NSPort *)aPort forMode:(NSRunLoopMode)mode;
configureAsServer - (void)configureAsServer;
Running a loop - (void)run;
- (BOOL)runMode:(NSRunLoopMode)mode beforeDate:(NSDate *)limitDate;
- (void)runUntilDate:(NSDate *)limitDate;
- (void)acceptInputForMode:(NSRunLoopMode)mode beforeDate:(NSDate *)limitDate;
scheduling and canceling Messages - (void)performSelector:(SEL)aSelector target:(id)target argument:(id)arg order:(NSUInteger)order modes:(NSArray<NSRunLoopMode> *)modes;
- (void)cancelPerformSelector:(SEL)aSelector target:(id)target argument:(id)arg;
- (void)cancelPerformSelectorsWithTarget:(id)target;
Run Loop Modes - (void)performBlock:(void (^)(void))block;
- (void)performInModes:(NSArray<NSRunLoopMode> *)modes block:(void (^)(void))block;

下面我们就看一下文档里面给出的NSRunloop主要的方法和属性等信息。

NSRunloop主要的方法和属性

参考文章

1. iOS NSRunloop详解
2. NSRunLoop原理详解——不再有盲点

后记

未完,待续~~~

上一篇下一篇

猜你喜欢

热点阅读