iOS 信号量详解
2016-08-17 23:53
393 查看
//
// ViewController.m
// test_if_else_01
//
// Created by jeffasd on 16/8/17.
// Copyright © 2016年 jeffasd. All rights reserved.
//
#import "ViewController.h"
@interface ViewController (){
dispatch_semaphore_t _frameRenderingSemaphore;
}
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
_frameRenderingSemaphore = dispatch_semaphore_create(1);
}
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
NSLog(@"%s", __func__);
//dispatch_semaphore_wait是否是在等待 _frameRenderingSemaphore大于0并且等待时间到返回NO _frameRenderingSemaphore小于等于0并且等待时间到返回YES
//由于 这里的参数是 DISPATCH_TIME_NOW 等待时间一直都是到的 只判断信号量是否大于0即可 信号量大于0 返回(零)NO 小于等于0返回YES(非0值)
// Returns zero on success (success is do not wait) 正在等待一个信号量 返回非0(YES)
// Waits for (decrements) a semaphore. 是否在等待一个信号量 是在等待一个信号量返回非0(YES) 不是在等待一个信号量返回0(NO)
dispatch_time_t time = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(5.0 * NSEC_PER_SEC));
// dispatch_time(DISPATCH_TIME_NOW, (int64_t)(5.0 * NSEC_PER_SEC))
#warning - 等待超时返回非零值 - dispatch_semaphore_wait函数检测是否等待超时
long var = dispatch_semaphore_wait(_frameRenderingSemaphore, time);//函数调用过信号量减1
// long var = dispatch_semaphore_wait(_frameRenderingSemaphore, DISPATCH_TIME_NOW);//函数调用过信号量减1
NSLog(@"var is %ld", var);
BOOL isWaitingTimeOut = var;
NSLog(@"isWaitingTimeOut is %@", isWaitingTimeOut ? @"YES" : @"NO");
// if (isSuccess != NO) {
//
// NSLog(@"等待超时退出并且信号量小于等于0");
// return;
// }
if (isWaitingTimeOut == YES) {
NSLog(@"等待超时退出并且信号量小于等于0");
return;
}
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(3.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
NSLog(@"the dispatch_semaphore_signal is");
dispatch_semaphore_signal(_frameRenderingSemaphore);//函数调用过信号量加1
});
NSLog(@"运行呀呀呀呀");
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
@end
// ViewController.m
// test_if_else_01
//
// Created by jeffasd on 16/8/17.
// Copyright © 2016年 jeffasd. All rights reserved.
//
#import "ViewController.h"
@interface ViewController (){
dispatch_semaphore_t _frameRenderingSemaphore;
}
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
_frameRenderingSemaphore = dispatch_semaphore_create(1);
}
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
NSLog(@"%s", __func__);
//dispatch_semaphore_wait是否是在等待 _frameRenderingSemaphore大于0并且等待时间到返回NO _frameRenderingSemaphore小于等于0并且等待时间到返回YES
//由于 这里的参数是 DISPATCH_TIME_NOW 等待时间一直都是到的 只判断信号量是否大于0即可 信号量大于0 返回(零)NO 小于等于0返回YES(非0值)
// Returns zero on success (success is do not wait) 正在等待一个信号量 返回非0(YES)
// Waits for (decrements) a semaphore. 是否在等待一个信号量 是在等待一个信号量返回非0(YES) 不是在等待一个信号量返回0(NO)
dispatch_time_t time = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(5.0 * NSEC_PER_SEC));
// dispatch_time(DISPATCH_TIME_NOW, (int64_t)(5.0 * NSEC_PER_SEC))
#warning - 等待超时返回非零值 - dispatch_semaphore_wait函数检测是否等待超时
long var = dispatch_semaphore_wait(_frameRenderingSemaphore, time);//函数调用过信号量减1
// long var = dispatch_semaphore_wait(_frameRenderingSemaphore, DISPATCH_TIME_NOW);//函数调用过信号量减1
NSLog(@"var is %ld", var);
BOOL isWaitingTimeOut = var;
NSLog(@"isWaitingTimeOut is %@", isWaitingTimeOut ? @"YES" : @"NO");
// if (isSuccess != NO) {
//
// NSLog(@"等待超时退出并且信号量小于等于0");
// return;
// }
if (isWaitingTimeOut == YES) {
NSLog(@"等待超时退出并且信号量小于等于0");
return;
}
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(3.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
NSLog(@"the dispatch_semaphore_signal is");
dispatch_semaphore_signal(_frameRenderingSemaphore);//函数调用过信号量加1
});
NSLog(@"运行呀呀呀呀");
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
@end
相关文章推荐
- iOS学习笔记74-完整详解GCD系列(四)dispatch_semaphore(信号量)
- iOS学习之GCD 信号量详解,dispatch_semaphore、NSOperationQueue
- 【iOS-Cocos2d游戏开发之五】【2】多触点与触屏事件详解(单一监听、事件分发)
- IOS名称意义详解
- IOS开发基础之──NSLog 输出格式详解
- 【iOS-Cocos2d游戏开发之十五】详解CCProgressTimer 进度条并修改cocos2d源码实现“理想”游戏进度条!
- 【详解iOS应用程序内使用IAP/StoreKit付费、沙盒(SandBox)测试、创建测试账号流程!】【二】
- 【iOS-Cocos2d游戏开发之十五】详解CCProgressTimer 进度条实现“理想”游戏进度条! 推荐
- 【iOS-Cocos2d游戏开发之五】多触点与触屏事件详解(单一监听、事件分发)【11月28日更新】
- 不只有iOS 八大智能手机操作系统详解
- ios iphone 详解在IOS后台执行
- UNIX多用户系统下信号量操作详解
- IOS名称意义详解
- IOS开发网络篇之──ASIHTTPRequest详解
- iOS开发之详解剪贴板
- linux下的trap命令和SIGHUP信号量详解
- NET多线程同步方法详解(五):信号量(Semaphore)
- cisco IOS SSH 配置示例及详解
- 【iOS-Cocos2d游戏开发之五】【1】多触点与触屏事件详解(单一监听、事件分发) 推荐
- 【详解iOS应用程序内使用IAP/StoreKit付费、沙盒(SandBox)测试、创建测试账号流程!】【一】