美文网首页
如何开启常驻线程

如何开启常驻线程

作者: 寂寞先森666 | 来源:发表于2019-07-11 15:18 被阅读0次
-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
        NSLog(@"1");
        dispatch_async(dispatch_get_global_queue(0, 0), ^{
            NSLog(@"2");
            [self performSelector:@selector(test) withObject:nil afterDelay:3];
            NSLog(@"3");
        });
        NSLog(@"4");
}
-(void)test
{
    NSLog(@"5");
}

2019-07-11 15:13:13.212408+0800 信号量[4091:635063] 1
2019-07-11 15:13:13.213029+0800 信号量[4091:635063] 4
2019-07-11 15:13:13.213803+0800 信号量[4091:635104] 2
2019-07-11 15:13:13.214460+0800 信号量[4091:635104] 3

可以看出test方法并没有执行,因为该线程已经释放了, 所以要正常执行的话必须保活该线程

-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
        NSLog(@"1");
        dispatch_async(dispatch_get_global_queue(0, 0), ^{
            NSLog(@"2");
            [[NSRunLoop currentRunLoop]run];//(model 添加item之前 启动)
            [self performSelector:@selector(test) withObject:nil afterDelay:3];
            NSLog(@"3");
        });
        NSLog(@"4");
}
-(void)test
{
    NSLog(@"5");
}

然而test方法依然不执行。
原因是如果RunLoop的mode中一个item都没有,RunLoop会退出。即在调用RunLoop的run方法后,由于其mode中没有添加任何item去维持RunLoop的时间循环,RunLoop随即还是会退出。
所以我们自己启动RunLoop,一定要在添加item后

-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
        NSLog(@"1");
        dispatch_async(dispatch_get_global_queue(0, 0), ^{
            NSLog(@"2");
            [self performSelector:@selector(test) withObject:nil afterDelay:3];
            [[NSRunLoop currentRunLoop]run];//(model 添加item之后 启动)
            NSLog(@"3");
        });
        NSLog(@"4");
}
-(void)test
{
     NSLog(@"5");
}

2019-07-11 16:08:07.235156+0800 信号量[4555:687390] 1
2019-07-11 16:08:07.235340+0800 信号量[4555:687390] 4
2019-07-11 16:08:07.235351+0800 信号量[4555:687445] 2
2019-07-11 16:08:07.235687+0800 信号量[4555:687445] 3

2019-07-11 16:08:10.236961+0800 信号量[4555:687445] 5

除了添加timer 也可以这样

[[NSRunLoop currentRunLoop] addPort:[NSMachPort port] forMode:NSDefaultRunLoopMode];
    [[NSRunLoop currentRunLoop] run];

相关文章

  • 如何开启常驻线程

    2019-07-11 15:13:13.212408+0800 信号量[4091:635063] 12019-07...

  • runloop

    runloop跟线程师一一对应的。 自己创建的线程师没有runloop 如何实现一个常驻线程: 1 为当前线程开启...

  • NSThread

    实现线程常驻如何实现?在方法内部开启一个RunLoopThread实现原理?内部 使用pthread_create...

  • Runloop开启常驻线程

  • RunLoop 基本使用

    RunLoop应用场景 开启一个常驻线程(让一个子线程不进入消亡状态,等待其他线程发来消息,处理其他事件)在子线程...

  • runloop深入探究,手动开启和关闭一个runloop

    提到iOS中开启一个常驻线程,网上最常见的就是在子线程中开启一个runloop,然后给runloop添加一个por...

  • 实现后台常驻线程

    添加一条用于常驻内存的强引用的子线程,在该线程的RunLoop下添加一个Sources,开启RunLoop。

  • 17 | 远超你想象的多线程的那些坑

    我们就一起来看看多线程技术常见的两个大坑,常驻线程和并发问题,分别是从何而来,以及如何避免吧。常驻线程我们先说说多...

  • Runloop理解

    Runloop:运行循环-死循环我们的应用程序在启动的时候1.开启一条线程!即主线程2.主线程为常驻线程!因为在线...

  • 浏览器和主引擎

    浏览器是多线程,js是异步单线程 ps:常驻线程一直存在,一直在待命。非常驻线程有需求的时候线程才会工作。 常驻线...

网友评论

      本文标题:如何开启常驻线程

      本文链接:https://www.haomeiwen.com/subject/ipldkctx.html