背景
在有些时候,我们需要通过信号量来对block运算和返回操作的顺序进行控制,达到先完成block中的计算后,再返回值的效果。
Example
/// #import <UserNotifications/UserNotifications.h>
- (BOOL)cj_chekEnableOfNotify {
if (@available(iOS 8.0,*)) {
dispatch_semaphore_t signal;
signal = dispatch_semaphore_create(0);
__block BOOL notificationEnable = NO;
// 这个时候不加信号量监听在block还没回调赋值之前就return了
[[UNUserNotificationCenter currentNotificationCenter] getNotificationSettingsWithCompletionHandler:^(UNNotificationSettings * _Nonnull settings) {
if (settings.authorizationStatus == UNAuthorizationStatusAuthorized) {
notificationEnable = YES;
}
dispatch_semaphore_signal(signal);
}];
// 等待状态获取完成
dispatch_semaphore_wait(signal, DISPATCH_TIME_FOREVER);
return notificationEnable;
} else {
UIRemoteNotificationType type = [[UIApplication sharedApplication] enabledRemoteNotificationTypes];
if(UIRemoteNotificationTypeNone != type){
return YES;
}
}
return NO;
}
加微信:FBY-fan 回复「面试题」,领取 11 类面试题,包含:多线程、内存管理、设计模式、数据安全及加密、数据结果与算法、网络、性能优化、Block、RunLoop、Runtime、UI 相关
关注公众号:Swift 社区 获取更多资源