您的位置:首页 > 移动开发 > IOS开发

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: