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;
}
这样的打印结果如下所示

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

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

 CFRunLoopStop(self.downloadRunloop);




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值