线程保活

线程保活例子

#import <Foundation/Foundation.h> typedef void (^LXPermenantThreadTask)(void); @interface LXPermenantThread : NSObject /** 开启线程 默认开启 */ - (void)run; /** 在当前子线程执行一个任务 */ - (void)executeTask:(LXPermenantThreadTask)task; /** 结束线程 */ - (void)stop; @end

 

#import "LXPermenantThread.h"
#import "LXProxy.h"

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

@interface LXPermenantThread()
@property (strong, nonatomic) LXThread *innerThread;
@end

@implementation LXPermenantThread
#pragma mark - public methods
- (instancetype)init{
    if (self = [super init]) {
        if (@available(iOS 10.0, *)) {
            __weak typeof(self)weakSelf = self;
            self.innerThread = [[LXThread alloc] initWithBlock:^{
                [weakSelf __saveThread];
            }];
            
        } else {
            self.innerThread = [[LXThread alloc]initWithTarget:[LXProxy proxyWithTarget:self] selector:@selector(__saveThread) object:nil];
        }
        
        [self.innerThread start];
    }
    return self;
}

- (void)run{
    if (!self.innerThread) return;
    
    if (!self.innerThread.isExecuting) {
         [self.innerThread start];
    }
}

- (void)executeTask:(LXPermenantThreadTask)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];
}

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

#pragma mark - private methods

-(void)__saveThread{

    CFRunLoopSourceContext context = {0};
    CFRunLoopSourceRef source = CFRunLoopSourceCreate(kCFAllocatorDefault, 0, &context);
    CFRunLoopAddSource(CFRunLoopGetCurrent(), source, kCFRunLoopDefaultMode);
    CFRelease(source);
    CFRunLoopRunInMode(kCFRunLoopDefaultMode, 1.0e10, false);
}

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

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

@end

 

posted @ 2020-04-20 16:27  小鱼的市场  阅读(210)  评论(0编辑  收藏  举报