美文网首页
13.runloop 练习理解

13.runloop 练习理解

作者: ProfessorFan | 来源:发表于2022-05-23 17:53 被阅读0次

问题

1.练习题1
当前代码 在主队列中执行


// 这里是函数开始执行的地方
  dispatch_queue_t queue = dispatch_get_global_queue(0, 0);
    
  dispatch_async(queue, ^{
        NSLog(@"1");
        // 这句代码的本质是往Runloop中添加定时器
        [self performSelector:@selector(test) withObject:nil afterDelay:.0];
        NSLog(@"3");
  });
- (void)test
{
    NSLog(@"2");
}

2.练习题2
当前代码在主线程当中运行


    NSThread *thread = [[NSThread alloc] initWithBlock:^{
        NSLog(@"1");
    }];
    [thread start];
    
    [self performSelector:@selector(test) onThread:thread withObject:nil waitUntilDone:YES];
- (void)test
{
    NSLog(@"2");
}

3.练习题3
当前代码在主线程当中运行


    NSThread *thread = [[NSThread alloc] initWithBlock:^{
        NSLog(@"1");
        
        [[NSRunLoop currentRunLoop] addPort:[[NSPort alloc] init] forMode:NSDefaultRunLoopMode];
        [[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]];
    }];
    [thread start];
    
    [self performSelector:@selector(test) onThread:thread withObject:nil waitUntilDone:YES];
    [self performSelector:@selector(test) onThread:thread withObject:nil waitUntilDone:YES];

- (void)test
{
    NSLog(@"2");
}

答案

1.练习题1

结果: 打印 1 和 3
分析: 子线程当中,默认不开启runloop [self performSelector:@selector(test) withObject:nil afterDelay:.0];这句代码本质是向当前子线程的runloop 当中添加了一个定时器,但是子线程当中runloop 默认不会启动,所以不会打印 2
解决方案:
在NSlog(@"3")前面添加 [[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]];就可以了

2.练习题2

结果:打印 1 之后奔溃
分析,由于子线程start 之后,没有相应开启runloop 给子线程保活,子线程已经执行完 block 就已经死掉了,之后在在子线程中执行 test函数,肯定就会奔溃.
解决方案:
在NSlog(@"1")下面添加保活代码:
[[NSRunLoop currentRunLoop] addPort:[[NSPort alloc] init] forMode:NSDefaultRunLoopMode];
[[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]];

3.练习题3

结果打印1 2 之后奔溃
分析: [[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]];
只会执行一次,相当于保证了一次,当第一次执行完之后,线程也就死掉来了,第二次在执行test 函数,也就导致奔溃
解决方案:
while (1){
[[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]];
} 这样就保证了线程一直存在

相关文章

  • 13.runloop 练习理解

    问题 1.练习题1当前代码 在主队列中执行 2.练习题2当前代码在主线程当中运行 3.练习题3当前代码在主线程当中...

  • 练习理解

    理解二字说起来容易,做起来难,如果我们每个人都互相多理解下,那么就更好了,这世道也不会那么冷漠了。 从一件小事说起...

  • 13.runloop 解决常驻线程

    问题 1.整么样在子线程中启动一个runloop2.整么样结束某一个线程中的runloop3.整么用runloop...

  • 刻意练习是什么,如何做好?

    分为:如何理解刻意练习,刻意练习的方法,如何做好输入和输出? 如何理解刻意练习? 核心:设计不同的场景,不断的练习...

  • 阅读理解A练习

  • 【“刻意练习”的思考和分享】

    1. 你对“刻意练习”的理解是什么? 关于刻意练习,听说了很多,我的理解是有目标的刻意练习,从“知识”到“技能”也...

  • “刻意练习”的思考和分享

    1. 你对“刻意练习”的理解是什么? 关于刻意练习,听说了很多,我的理解是有目标的刻意练习,从“知识”到“技能”也...

  • 【146/1000】什么是刻意练习?

    01 以前对于刻意练习,只是一种浅显的理解,并没有真正深入的理解其内涵。通过读《刻意练习》这本书,让我对刻意练习有...

  • 早安分享20210222——得到

    信息+理解=知道 + =得到 练习+应用=做到

  • 书单

    理解未来的几个原则 原则 刻意练习

网友评论

      本文标题:13.runloop 练习理解

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