ios-设置线程满足某个条件销毁

有的时候我们可能会用到NSThread来进行创建线程然后去执行任务,但是如果我们想让一个任务在执行之后可以再接下去执行下一个任务的话。如果前一个任务执行的够快的话,这个线程就会被销毁了,我们应该如何去保证这个线程去保留下来。这个时候我们就应该去从Runloop着手,因为主线程之所以一直不销毁就是因为有Runloop的存在。所以我们也可以从这方便着手,代码如下所示。

首先先设置一个标记属性就是标记这个任务有没有完成的,如果我们直接开始运行循环的话,就会一直循环一直循环无法关闭。

@property (nonatomic,assign)BOOL flag;

刚开始我们先初始化为NO,在第一个任务完成之后再设置为YES,然后运行循环运行的条件就是根据这个flag来判断的

    //创建线程对象
    NSThread * thread = [[NSThread alloc]initWithTarget:self selector:@selector(mooc) object:nil];
    [thread start];
    self.flag=NO;
    [self performSelector:@selector(demo) onThread:thread withObject:nil waitUntilDone:NO];
方法如下所示

-(void)mooc
{
    NSLog(@"mooc");
    while(!self.flag)
    {    
        //这里其实就是指每隔0.1秒去运行一次,也就是说会去询问当前线程还有没有任务,有任务就去处理。其实就是当前线程有当前设置的runMode下的事件发生,
        //runloop就会启动,处理对应的事件。如果没有事件发生
        [[NSRunLoop currentRunLoop]runMode:NSDefaultRunLoopMode beforeDate:[NSDate dateWithTimeIntervalSinceNow:0.1]];
    }
    NSLog(@"完成");
}
-(void)demo
{
    NSLog(@"kkkk");
    self.flag=YES;
}
这样的打印结果如下所示

ios-设置线程满足某个条件销毁_第1张图片

但其实采取上面的这个方法是相当的消耗资源的,其实我们还可以考虑使用Core Foundation框架的CFRunloop来做,就比如说开启当前的消息循环,然后在子线程中开启消息循环,其中downloadRunloop是@property(assign,nonatomic)CFRunLoopRef downloadRunloop;

       //1.拿到当前线程的运行循环
        self.downloadRunloop = CFRunLoopGetCurrent();
        //2.启动运行循环
        CFRunLoopRun();
最后在满足想要的条件的时候,我们再关闭这个运行循环

 CFRunLoopStop(self.downloadRunloop);




你可能感兴趣的:(ios-开发)