美文网首页
iOS 常见面试题--runloop 线程保活

iOS 常见面试题--runloop 线程保活

作者: 奋斗的小马达 | 来源:发表于2021-01-26 14:40 被阅读0次

在实际开发过程中 怎样控制线程的生命周期?(也就是线程保活)

在面试过程中我们经常会被问到线程保活的问题,下面将研究 iOS开发中如何控制线程的生命周期

首先我们先了解一些概念:

线程和runloop是一对一的关系,一个线程中有且只有一个runloop  runloop会在线程结束时销毁。子线程的runloop并不会主动创建和开启。 
runloop 顾名思义就是运行循环,让程序在运行中一直循环做事情。想要让线程保活就必须开启线程的runloop

下面封装一个可以控制线程生命周期的工具类

PermenantThread.h


#import <Foundation/Foundation.h>

NS_ASSUME_NONNULL_BEGIN
typedef void (^PermenantThreadTask)(void);

@interface PermenantThread : NSObject

/**
 在当前子线程执行一个任务
 */
- (void)executeTask:(PermenantThreadTask)task;

/**
 结束线程
 */
- (void)stop;

@end

NS_ASSUME_NONNULL_END

PermenantThread.m

#import "PermenantThread.h"

@interface PermenantThread()
@property (strong, nonatomic) NSThread *myThread;
@property (assign, nonatomic, getter=isStopped) BOOL stopped;
@end

@implementation PermenantThread

#pragma mark - public methods
- (instancetype)init{
    if (self = [super init]) {
        self.stopped = NO;
        __weak typeof(self) weakSelf = self;
        self.myThread = [[NSThread alloc] initWithBlock:^{
            [[NSRunLoop currentRunLoop] addPort:[[NSPort alloc] init] forMode:NSDefaultRunLoopMode];
            while (weakSelf && !weakSelf.isStopped) {
                [[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]];
            }
        }];
        [self.myThread start];
    }
    return self;
}


- (void)executeTask:(PermenantThreadTask)task{
    if (!self.myThread || !task) return;
    [self performSelector:@selector(__executeTask:) onThread:self.myThread withObject:task waitUntilDone:NO];
}

- (void)stop{
    if (!self.myThread) return;
    [self performSelector:@selector(__stop) onThread:self.myThread withObject:nil waitUntilDone:YES];
}

- (void)dealloc{
    NSLog(@"%s", __func__);
    
    [self stop];
}

#pragma mark - private methods
- (void)__stop{
    self.stopped = YES;
    CFRunLoopStop(CFRunLoopGetCurrent());
    self.myThread = nil;
}

- (void)__executeTask:(PermenantThreadTask)task{
    task();
}

@end

相关文章

网友评论

      本文标题:iOS 常见面试题--runloop 线程保活

      本文链接:https://www.haomeiwen.com/subject/dhxgzktx.html