方法調(diào)用者希望調(diào)用的是一個同步返回的方法,而不是以callback形式攜帶返回值的方法。
// 同步方法
- (NSInteger)methodSync {
??? __blockNSIntegerresult =0;
??? [selfmethodAsync:^(NSIntegervalue) {
??????? result = value;
??? }];
??// 如果result同步返回就好了
???returnresult;
}
// 異步方法
- (void)methodAsync:(void(^)(NSIntegerresult))callBack {
???dispatch_async(dispatch_get_global_queue(0,0), ^{
???????NSLog(@"methodAsync 異步開始");
??????? sleep(2);
???????NSLog(@"methodAsync 異步結(jié)束");
???????if(callBack) {
??????????? callBack(5);
??????? }
??? });
}
iOS編程將異步方法轉(zhuǎn)化為同步方法
dispatch_group可以很方便的管理多個派發(fā)任務(wù),并在任務(wù)結(jié)束時候可以得到回調(diào)通知沟娱,或者可以一直阻塞線程直到派發(fā)組內(nèi)的所有派發(fā)任務(wù)都完成
方式一:使用派發(fā)組dispatch_group
- (NSInteger)methodSync {
???NSLog(@"methodSync 開始");
??? __blockNSIntegerresult =0;
??? dispatch_group_t group = dispatch_group_create();
??? dispatch_group_enter(group);
??? [selfmethodAsync:^(NSIntegervalue) {
??????? result = value;
??????? dispatch_group_leave(group);
??? }];
??? dispatch_group_wait(group, DISPATCH_TIME_FOREVER);
???NSLog(@"methodSync 結(jié)束 result:%ld", (long)result);
???returnresult;
}
方式二(推薦):使用信號量dispatch_semaphore
dispatch_semaphore通常是用來多線程執(zhí)行多個并發(fā)任務(wù)時通過信號量的方式對并發(fā)執(zhí)行數(shù)量的限制因宇。當(dāng)信號量不夠(=0)的時候當(dāng)前調(diào)用線程將被阻塞,所以我們可以通過模擬信號量不夠的情況來阻塞同步方法的返回官还,直到方法內(nèi)部的異步回調(diào)之后;
- (NSInteger)methodSync {
???NSLog(@"methodSync 開始");
??? __blockNSIntegerresult =0;
??? dispatch_semaphore_t sema = dispatch_semaphore_create(0);
??? [selfmethodAsync:^(NSIntegervalue) {
??????? result = value;
??????? dispatch_semaphore_signal(sema);
??? }];
??// 這里本來同步方法會立即返回毒坛,但信號量=0使得線程阻塞
??// 當(dāng)異步方法回調(diào)之后望伦,發(fā)送信號,信號量變?yōu)?煎殷,這里的阻塞將被解除屯伞,從而返回正確的結(jié)果
??? dispatch_semaphore_wait(sema, DISPATCH_TIME_FOREVER);
???NSLog(@"methodSync 結(jié)束 result:%ld", (long)result);
???returnresult;
}