#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