加强对iOS信号量的理解

2018-10-10  本文已影响23人  lanmoyingsheng

- (void)semaphoreDemo {
    
    // 这里可以尝试使用2,1,0,分别测试打印结果。
    dispatch_semaphore_t semathore = dispatch_semaphore_create(2);
    
    dispatch_queue_t queue = dispatch_queue_create("barr", DISPATCH_QUEUE_CONCURRENT);
    //dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    
    
    dispatch_async(queue, ^{
        
        dispatch_semaphore_wait(semathore, DISPATCH_TIME_FOREVER);
        
        NSLog(@"task 1");
        
        sleep(5);
        
        NSLog(@"task 1 finished");
        
        dispatch_semaphore_signal(semathore);
        
    });
    
    dispatch_async(queue, ^{
        
        dispatch_semaphore_wait(semathore, DISPATCH_TIME_FOREVER);
        
        NSLog(@"task 2");
        
        sleep(5);
        
        NSLog(@"task 2 finished");
        
        dispatch_semaphore_signal(semathore);
        
    });
    
    dispatch_async(queue, ^{
        
        dispatch_semaphore_wait(semathore, DISPATCH_TIME_FOREVER);
        
        NSLog(@"task 3");
        
        sleep(2);
        
        NSLog(@"task 3 finished");
        
        dispatch_semaphore_signal(semathore);
        
    });
    
    
}

打印结果:
2018-10-10 17:24:03.102436+0800 SemaphoreDemo[8970:206016] task 2
2018-10-10 17:24:03.102455+0800 SemaphoreDemo[8970:206017] task 1
2018-10-10 17:24:08.105001+0800 SemaphoreDemo[8970:206016] task 2 finished
2018-10-10 17:24:08.105019+0800 SemaphoreDemo[8970:206017] task 1 finished
2018-10-10 17:24:08.105172+0800 SemaphoreDemo[8970:206018] task 3
2018-10-10 17:24:10.110506+0800 SemaphoreDemo[8970:206018] task 3 finished

如果理解上面的代码,可以看下实际中的部分应用

func fetch_MSVA_data() {
    
    let semaphore = DispatchSemaphore(value: 0)
    let task = Alamofire.request(URLHelper.home_MSVA_Url()).responseJSON { (response) in
    
        if let dictionary = response.result.value  {
            
            self.msvaModel = HomeMSVAModel(jsonData:JSON(dictionary))
            self.calculeHomeAdvCellHeight()
        } else {
            self.msvaModel = nil
        }
    
        print("3")
        semaphore.signal() // 这里的当前线程是主线程,这里会唤醒被阻塞的线程。
    }
     
    // 这里会直接阻塞当前线程(当前线程不是主线程)
    let result = semaphore.wait(timeout: DispatchTime.now()+5)
    print("3:\(result)")
}
上一篇下一篇

猜你喜欢

热点阅读