美文网首页
加强对iOS信号量的理解

加强对iOS信号量的理解

作者: lanmoyingsheng | 来源:发表于2018-10-10 17:34 被阅读23次
    
    - (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)")
    }
    

    相关文章

      网友评论

          本文标题:加强对iOS信号量的理解

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