NSRunLoopiOS之runloop

NSRunloop简单细说(三)—— 定时器和端口

2017-08-23  本文已影响49人  刀客传奇

版本记录

版本号 时间
V1.0 2017.08.22

前言

NSRunloopOC Foundation框架中非常重要的一个类,很多时候我们会使用它,但是未必对其有深入的了解,接下来几篇我就会带着大家重新学习一下NSRunloop这个类,从简单到复杂,从基本到深化,我会一步步的走完。希望对大家有所帮助。感兴趣的可以看我上一篇。
1. NSRunloop简单细说(一)—— 整体了解
2. NSRunloop简单细说(二)—— 获取运行循环及其模式

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

这个方法我们经常用,其实就是将定时器加入到runloop中,才能开启定时器。

下面我们看一下参数:

下面看一个例子

- (void)demoAddTimer
{
    NSTimer *timer = [NSTimer timerWithTimeInterval:2.0 repeats:YES block:^(NSTimer * _Nonnull timer) {
        NSLog(@"A");
    }];
    [[NSRunLoop currentRunLoop] addTimer:timer forMode:NSDefaultRunLoopMode];
}

看一下输出结果

2017-08-23 12:20:57.584335+0800 JJOC[11019:5299493] A
2017-08-23 12:20:59.584386+0800 JJOC[11019:5299493] A
2017-08-23 12:21:01.584310+0800 JJOC[11019:5299493] A
2017-08-23 12:21:03.584310+0800 JJOC[11019:5299493] A
2017-08-23 12:21:05.584304+0800 JJOC[11019:5299493] A
2017-08-23 12:21:07.584378+0800 JJOC[11019:5299493] A

还有几点需要注意:

结论:这个很常用,大家需要谨记。


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

该方法的作用就是:将端口作为输入源添加到运行循环的指定模式。其实就是往RunLoop的 Mode 中添加一个source1任务。

下面看一下参数:

我们在AFNetworking中就看到了这个方法的使用,如下所示:

+ (void)networkRequestThreadEntryPoint:(id)__unused object 
{
    @autoreleasepool {
        [[NSThread currentThread] setName:@"AFNetworking"];
        NSRunLoop *runLoop = [NSRunLoop currentRunLoop];
        [runLoop addPort:[NSMachPort port] forMode:NSDefaultRunLoopMode];
        [runLoop run];
    }
}

这里,开启了一个线程,同时开启runloop,并添加了一个port事件维系runloop 的运行,但是port并不发送时机的消息。这个线程是AFNetWorking用于将NSURLConection置于后台处理请求和回调的。不过现在NSURLConection已经被该框架所废弃了。大家知道这个用法和使用情况就可以了,其实编程思想比代码实现要重要的多。

下面还要注意:

结论:思路很重要,需要大家思考。


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

其实,只要你看过上面那个方法,那么这个方法的作用就很明显了,该方法的作用:从运行循环的指定输入模式中删除端口。这里就不多说参数什么的了,同上所示即可。

这里,还有几点需要注意:

结论:同上。

参考文章

1. iOS RunLoop了解和使用

后记

未完,待续~~~~

上一篇 下一篇

猜你喜欢

热点阅读