iOS底层系列之<30>--Runloop<六>Runloop中线程保活封装

1、对上一篇的内容进行封装设计

#import <Foundation/Foundation.h>

NS_ASSUME_NONNULL_BEGIN

@interface MyThread : NSObject

- (void)run;
- (void)stop;
- (void)excuteTaskWithTarget:(id)target action:(SEL)action object:(id)object;
- (void)excuteTask:(void (^)(void))Task;
@end

NS_ASSUME_NONNULL_END
#import "MyThread.h"

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

//-----------分割线--------------//

@interface MyThread()
@property (strong, nonatomic) PrivateThread *priThread;
@property (assign, nonatomic) BOOL isStop;
@end


@implementation MyThread

#pragma mark -- public Methods
- (instancetype)init {
    if (self = [super init]) {
        self.isStop = NO;
        
        __weak typeof(self) weakSelf = self;
        
        self.priThread = [[PrivateThread alloc] initWithBlock:^{
            [[NSRunLoop currentRunLoop] addPort:[[NSPort alloc] init] forMode:NSDefaultRunLoopMode];
            
            while (weakSelf && !weakSelf.isStop) {
                NSLog(@"1---1");
                [[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]];
            }
        }];
    }
    return self;
}

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

- (void)excuteTaskWithTarget:(id)target action:(SEL)action object:(id)object {
    if (!self.priThread) {
        return;
    }
    
    [target performSelector:action onThread:self.priThread withObject:object waitUntilDone:NO];
}

- (void)excuteTask:(void (^)(void))Task {
    if (!self.priThread || !Task) {
        return;
    }
    
    [self performSelector:@selector(innerExcuteTask:) onThread:self.priThread withObject:Task waitUntilDone:NO];
}

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

- (void)dealloc {
    [self stop];
}

#pragma mark -- private Methods
- (void)innerStop {
    NSLog(@"innerStop");
    self.isStop = YES;
    CFRunLoopStop(CFRunLoopGetCurrent());
        
    self.priThread = nil;
}


- (void)innerExcuteTask: (void (^)(void))task {
    task();
}

@end
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值