#import "ViewController.h"
@interface ViewController ()
@property (nonatomic ,strong) NSString *someString;
@property dispatch_queue_t syncQueue;
@end
@implementation ViewController
/**
* 获取方法可能会死锁
*/
-(NSString *)someString{
__block NSString *localSomeString;
dispatch_sync(_syncQueue, ^{
localSomeString = self.someString;
});
return localSomeString;
}
-(void)setSomeString:(NSString *)someString{
dispatch_async(_syncQueue, ^{
self.someString = someString;
});
}
- (void)viewDidLoad {
[super viewDidLoad];
//dispatch_get_current_queue 判断当前代码正在那个队列上执行,iOS6.0后已弃用
//由于队列间有层级关系,所以“检查当前队列是否执行同步派发所用的队列”这种办法并不总有效。
/**
* ”队列特有数据“
*
* @return 任意数据以键值对的形式关联到队列里
*/
dispatch_queue_t queueA = dispatch_queue_create("queueA.Jie", NULL);
dispatch_queue_t queueB = dispatch_queue_create("queueB.Zou", NULL);
dispatch_set_target_queue(queueA, queueB);
static int kQueueSpecific;
CFStringRef queueSpecificValue = CFSTR("queueA");
dispatch_queue_set_specific(queueA, &queueSpecificValue, (void *)queueSpecificValue, (dispatch_function_t)CFRelease);
//queueA 待设置数据的队列 &queueSpecificValue (void *)queueSpecificValue 键和值 (dispatch_function_t)CFRelease 析构函数(只能带一个指针参数且返回值必须是void)调用CFRelease“参数”以清理旧值
dispatch_sync(queueB, ^{
dispatch_block_t block = ^{NSLog(@"No deadLock");};
CFStringRef retriedValue = dispatch_get_specific(&kQueueSpecific);
if (retriedValue){
block();
}else{
dispatch_sync(queueA, ^{
});
}
});
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
@end
转载于:https://my.oschina.net/u/2319073/blog/651853