美文网首页
13.runloop 解决常驻线程

13.runloop 解决常驻线程

作者: ProfessorFan | 来源:发表于2022-05-22 07:30 被阅读0次

问题

1.整么样在子线程中启动一个runloop
2.整么样结束某一个线程中的runloop
3.整么用runloop 封装一个常驻线程(也就是线程保活)

答案

1.整么样在子线程中启动一个runloop

1.C语言方式

// 这个是创建一个线程
   self.innerThread = [[FAN_BaseThread alloc] initWithBlock:^{
        
        NSLog(@"begin----");

        // 通过C语言方式实现runloop 启动
        
        // 1.创建上下文
        CFRunLoopSourceContext context = {0};
        
        // 2.创建source 用来线程保活
        CFRunLoopSourceRef source = CFRunLoopSourceCreate(kCFAllocatorDefault, 0, &context);
        
        // 3.当前的runloop 添加source
        CFRunLoopAddSource(CFRunLoopGetCurrent(), source, kCFRunLoopDefaultMode);
        
        // 4. 销毁创建的 source
        CFRelease(source);
        
        // 5.启动runloop
        CFRunLoopRunInMode(kCFRunLoopDefaultMode, 1.0e10, false);
        
        NSLog(@"end----");
    }];
  1. 通过OC方式启动runloop
        self.innerThread = [[MJThread alloc] initWithBlock:^{
            
            [[NSRunLoop currentRunLoop] addPort:[[NSPort alloc] init] forMode:NSDefaultRunLoopMode];
            
            while (weakSelf && !weakSelf.isStopped) {
                [[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]];
            }
        }];
        
        [self.innerThread start];

2.整么样结束某一个线程中的runloop

// 1.结束某一个runloop 肯定实在某一条子线程中执行
  [self performSelector:@selector(__stop) onThread:self.innerThread withObject:nil waitUntilDone:YES];

- (void)__stop
{
// 这个就是结束当前的runloop 
    CFRunLoopStop(CFRunLoopGetCurrent());
    self.innerThread = nil;
}

3.整么用runloop 封装一个常驻线程(也就是线程保活)

直接看源码吧

#import "FAN_PermenantThread.h"

/** FAN_BaseThread **/
@interface FAN_BaseThread : NSThread
@end
@implementation FAN_BaseThread
- (void)dealloc
{
    NSLog(@"%s", __func__);
}
@end

@interface FAN_PermenantThread()

@property (nonatomic,strong)FAN_BaseThread *innerThread;

@end

@implementation FAN_PermenantThread

- (instancetype)init
{
    self = [super init];
    if (self) {
        [self __initData];
    }
    return self;
}

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

#pragma mark public Method

/**
 开启线程
 */
- (void)run{
    
    if (!self.innerThread || self.innerThread.isExecuting) return;

    [self.innerThread start];
}

/**
 在当前子线程执行一个任务
 */
- (void)executeTask:(FAN_PermenantThreadTask)task{
    
    if (!self.innerThread || !task) return;
    
    [self performSelector:@selector(__executeTask:) onThread:self.innerThread withObject:task waitUntilDone:NO];
    
}

/**
 结束线程
 */
- (void)stop{
    
    if (!self.innerThread) return;
    
    [self performSelector:@selector(__stop) onThread:self.innerThread withObject:nil waitUntilDone:YES];
}

#pragma mark private Method
- (void)__initData {
    
    self.innerThread = [[FAN_BaseThread alloc] initWithBlock:^{
        
        NSLog(@"begin----");

        // 通过C语言方式实现
        
        // 1.创建上下文
        CFRunLoopSourceContext context = {0};
        
        // 2.创建source 用来线程保活
        CFRunLoopSourceRef source = CFRunLoopSourceCreate(kCFAllocatorDefault, 0, &context);
        
        // 3.当前的runloop 添加source
        CFRunLoopAddSource(CFRunLoopGetCurrent(), source, kCFRunLoopDefaultMode);
        
        // 4. 销毁创建的 source
        CFRelease(source);
        
        // 5.启动runloop
        CFRunLoopRunInMode(kCFRunLoopDefaultMode, 1.0e10, false);
        
        NSLog(@"end----");
    }];
    
}

- (void)__stop
{
    CFRunLoopStop(CFRunLoopGetCurrent());
    self.innerThread = nil;
}

- (void)__executeTask:(FAN_PermenantThreadTask)task
{
    if (task) {
        task();
    }
}

@end

相关文章

  • 13.runloop 解决常驻线程

    问题 1.整么样在子线程中启动一个runloop2.整么样结束某一个线程中的runloop3.整么用runloop...

  • 浏览器和主引擎

    浏览器是多线程,js是异步单线程 ps:常驻线程一直存在,一直在待命。非常驻线程有需求的时候线程才会工作。 常驻线...

  • 常驻线程

    模仿曾经的AFN常驻线程写法,现在的YY的写法也是如此 使用performSelector: onThread:简...

  • 常驻线程

  • 常驻线程

    当创建一个线程,并且希望它一直存在时,但往往我们创建的线程都是执行完成之后也就停止了,不能再次利用,那么如何创建一...

  • AFNetworking3.0后为什么不再需要常驻线程?

    AFNetworking3.0后为什么不再需要常驻线程? AFNetworking3.0后为什么不再需要常驻线程?

  • iOS 多线程面试题(NSThread+runloop实现常驻线

    NSThread+runloop实现常驻线程 NSThread在实际开发中比较常用到的场景就是去实现常驻线程。 由...

  • 线程池几个重要参数

    corePoolSize 线程池中常驻线程核心线程数 maximumPoolSize 线程池中同时容纳可执行的线程...

  • RunLoop常驻线程

    在开发中,经常遇到的便是开启一个线程,当线程的任务完成,该线程便会被自动收回。但是如果我们需要一个线程一直存在,等...

  • 线程常驻内存

    iOS开发中,新创建的线程,执行完成后会销毁,如何让线程常驻内存 使用场景 随时监听某些状态改变,如监听网络状态

网友评论

      本文标题:13.runloop 解决常驻线程

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