使用runloop阻塞线程

RunLoop从字面上看是运行循环的意思,这一点也不错,它确实就是一个循环的概念,或者准确的说是线程中的循环。

每一个线程都有其对应的RunLoop,但是默认非主线程的RunLoop是没有运行的,需要为RunLoop添加至少一个事件源,然后去run它。一般情况下我们是没有必要去启用线程的RunLoop的,除非你在一个单独的线程中需要长久的检测某个事件。


使用runloop阻塞线程直接上代码:

- (void)viewDidLoad {
    [super viewDidLoad];
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        NSLog(@"========1========");
        [self Test1];
        while (!end) {
            NSLog(@"========runloop start========");
            [[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]];
            NSLog(@"========runloop end========");
        }
        NSLog(@"========5========");
    });
    // Do any additional setup after loading the view, typically from a nib.
}

-(void)Test1{
    NSBlockOperation *block = [[NSBlockOperation alloc] init];
    [block addExecutionBlock:^{
        dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
            sleep(3);
            NSLog(@"========3========");
            [self Test2];
        });
    }];
    [block setCompletionBlock:^{
        NSLog(@"========2========");
    }];
    [block start];

}

-(void)Test2{
    NSLog(@"========4========");
    end = YES;
}


你可能感兴趣的:(IOS)