iOS 常驻线程如何创建

2019-04-09  本文已影响0人  iOS开发

@interface ViewController ()

@property (nonatomic,strong) NSThread *thread;

@end

@implementation ViewController

-(void)viewDidLoad{

    [super viewDidLoad];

    self.view.backgroundColor = [UIColor whiteColor];

    //获取这个常驻内存的线程

    self.thread=  [ViewController longTermThread];

}

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent*)event{

    //在该线程上提交任务

    [self performSelector:@selector(test) onThread:self.thread withObject:nil waitUntilDone:NO];

}

-(void)test{

    NSLog(@"test");

    NSLog(@"%@",[NSThread currentThread]);

}

+ (void)entryPoint

{

    //设置当前线程名为MyThread

    [[NSThread currentThread] setName:@"MyThread"];

    //获取NSRunLoop对象,第一次获取不存在时系统会创建一个

    NSRunLoop*runloop = [NSRunLoopcurrentRunLoop];

    /*

     添加一个Source1事件的监听端口

     RunLoop对象会一直监听这个端口,由于这个端口不会有任何事件到来所以不会产生影响

     监听模式是默认模式,可以修改为Common

     */

    [runloopaddPort:[NSPort port] forMode:NSDefaultRunLoopMode];

    //启动RunLoop

    [runlooprun];

}

+ (NSThread*)longTermThread

{

    //静态变量保存常驻内存的线程对象

    staticNSThread*longTermThread =nil;

    //使用GCD dispatch_once 在应用生命周期只执行一次常驻线程的创建工作

    staticdispatch_once_tonceToken;

    dispatch_once(&onceToken, ^{

        //创建一个线程对象,并执行entryPoint方法

        longTermThread = [[NSThreadalloc]initWithTarget:selfselector:@selector(entryPoint)object:nil];

        //启动线程,启动后就会执行entryPoint方法

        [longTermThreadstart];

    });

    returnlongTermThread;

}

@end

上一篇下一篇

猜你喜欢

热点阅读