加强对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)")
}