1.Aspects
使用自旋锁,但是自旋锁目前是不建议使用的,可以参考下篇文章:
https://blog.ibireme.com/2016/01/16/spinlock_is_unsafe_in_ios/
以及各种锁的比较:
https://bestswifter.com/ios-lock/
static void bwaspect_performLocked(dispatch_block_t block) {
static OSSpinLock aspect_lock = OS_SPINLOCK_INIT;
OSSpinLockLock(&aspect_lock);
block();
OSSpinLockUnlock(&aspect_lock);
}
static void _bwaspect_modifySwizzledClasses(void (^block)(NSMutableSet *swizzledClasses)) {
static NSMutableSet *swizzledClasses;
static dispatch_once_t pred;
dispatch_once(&pred, ^{
swizzledClasses = [NSMutableSet new];
});
@synchronized(swizzledClasses) {
block(swizzledClasses);
}
}
2.AFN
使用串行队列,同步执行
static dispatch_queue_t url_session_manager_creation_queue() {
static dispatch_queue_t BDWXM_url_session_manager_creation_queue;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
BDWXM_url_session_manager_creation_queue = dispatch_queue_create("bdwxm.com.alamofire.networking.session.manager.creation", DISPATCH_QUEUE_SERIAL);
});
return BDWXM_url_session_manager_creation_queue;
}
static void url_session_manager_create_task_safely(dispatch_block_t block) {
if (NSFoundationVersionNumber < NSFoundationVersionNumber_With_Fixed_5871104061079552_bug) {
// Fix of bug
// Open Radar:http://openradar.appspot.com/radar?id=5871104061079552 (status: Fixed in iOS8)
// Issue about:https://github.com/BDWXMNetworking/BDWXMNetworking/issues/2093
dispatch_sync(url_session_manager_creation_queue(), block);
} else {
block();
}
}