希望异步实现同步场景
在开发中我们经常会遇到异步方法,在设计程序逻辑的时候有些操作依赖于异步的回调结果,有时候我们不得不把一个原本内聚的逻辑
通过代理或者回调的方式打散
开来,这样作它打乱了我们代码顺序执行的流程。如果这个方法是同步的就好了
如:一个需要用户等待的过程(就是有没有阻塞主线程,对用户而言没区别),有很多异步任务需要有序执行,这时就没必要在异步回调后再通知外层继续。直接写成同步的就好了。
实现方式如下几种:
假设:有这么一个异步任务
代码语言:javascript复制- (void)deviceWithKey:(NSString *)key result:(void(^)(NSString *value))complete {
NSDictionary *dic = @{@"mac1":@"device1"};
complete(dic[key]);
}
一、使用信号量 diapatch_semaphore
代码语言:javascript复制- (NSString *)syncFindDevice1 {
NSString __block *result;
dispatch_semaphore_t semaphore = dispatch_semaphore_create(0); //
[self deviceWithKey:@"mac1" result:^(NSString *value) {
result = value;
dispatch_semaphore_signal(semaphore); //
}];
dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER); //
return result;
}
二、使用派发组 dispatch_group
代码语言:javascript复制- (NSString *)syncFindDevice2 {
NSString __block *result;
dispatch_group_t group = dispatch_group_create(); //
dispatch_group_enter(group); //
[self deviceWithKey:@"mac1" result:^(NSString *value) {
result = value;
dispatch_group_leave(group); //
}];
dispatch_group_wait(group, DISPATCH_TIME_FOREVER); //
return result;
}
参考: iOS开发技巧: 将异步方法封装成同步方法