当前位置: 代码迷 >> 综合 >> Runloop 应用 -线程保活
  详细解决方案

Runloop 应用 -线程保活

热度:95   发布时间:2024-02-05 07:23:13.0

在开发场景中,有可能需要对某条线程保活,让这条线程在有事情做的时候进行工作,没有事情做的时候进行休眠。

线程保活

    • 创建线程和在线程获得runloop
    • 停止Runloop

创建线程和在线程获得runloop

这里面我创建了一个线程 为MYthread 继承 NSThread
对delloc方法进行重写 帮助我们判断线程是否存活
在这里插入图片描述
创建线程的方法大致有两种

-(void) TargetcreatMyThread {self.myThread = [[MyThread alloc] initWithTarget:self selector:@selector(start) object:nil];[self.myThread start];
}-(void) start {[[NSRunLoop currentRunLoop] addPort:[[NSPort alloc]init] forMode:NSDefaultRunLoopMode];[[NSRunLoop currentRunLoop] run];}

利用target进行创建,但是这种方法会对viewcontroller进行强引用,而Thread本身属性关键字为strong 会被 viewcontroller强引用,相互强引用导致控制器无法dealloc,造成循环引用,所以我在这里使用block的方法进行创建

-(void) BlockcreatMyThread {__weak  typeof(self) weakself = self;//self.isStop = NO;self.myThread = [[MyThread alloc] initWithBlock:^{// [weakself start];[[NSRunLoop currentRunLoop] addPort:[[NSPort alloc]init] forMode:NSDefaultRunLoopMode];[[NSRunLoop currentRunLoop] run];}}];[self.myThread start];
}```go
利用  NSThread 创建一条线程,并且在这条线程创建一个 RunLoop,并创建一个 source,防止 RunLoop退出,这里也可以新建一个集成于 NSThread 的类,观察NSThread是否被释放,同时创建一个标志属性stopped初始值为 NO来判断是否要退出 RunLoop.-(void) BlockcreatMyThread {__weak  typeof(self) weakself = self;self.isStop = NO;self.myThread = [[MyThread alloc] initWithBlock:^{// [weakself start];[[NSRunLoop currentRunLoop] addPort:[[NSPort alloc]init] forMode:NSDefaultRunLoopMode];// [[NSRunLoop currentRunLoop] run];while (!weakself.isStop&&weakself) {[[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]];}}];[self.myThread start];
}

在这里使用runMode而不是run的原因是
在这里插入图片描述

停止Runloop

-(void) cancle
{[self performSelector:@selector(__stop) onThread:self.myThread withObject:nil waitUntilDone:YES];}-(void)__stop {self.isStop = YES;CFRunLoopStop(CFRunLoopGetCurrent());self.myThread = nil;
}

我们按下取消button runloop会停止同时线程会死亡
在这里插入图片描述

在这里插入图片描述 在dealloc中 调用cancle ,是为了当我的viewcontroler的消失的时候,thread也一同消失防止内存泄漏。

RunLoop线程保活demo