TDSMacros.h 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. //
  2. // TDSMacros.h
  3. // TDSCommon
  4. //
  5. // Created by Insomnia on 2020/10/19.
  6. //
  7. #import <Foundation/Foundation.h>
  8. #import <TapCommonSDK/TDSmetamacro.h>
  9. #ifndef TDS_LOCK
  10. #define TDS_LOCK(lock) dispatch_semaphore_wait(lock, DISPATCH_TIME_FOREVER);
  11. #endif
  12. #ifndef TDS_UNLOCK
  13. #define TDS_UNLOCK(lock) dispatch_semaphore_signal(lock);
  14. #endif
  15. #define TDSSemaphoreCreate \
  16. static dispatch_semaphore_t signalSemaphore; \
  17. static dispatch_once_t onceTokenSemaphore; \
  18. dispatch_once(&onceTokenSemaphore, ^{ \
  19. signalSemaphore = dispatch_semaphore_create(1); \
  20. });
  21. #define TDSSemaphoreWait TDS_LOCK(signalSemaphore)
  22. #define TDSSemaphoreSignal TDS_UNLOCK(signalSemaphore)
  23. #ifndef weakify
  24. #define weakify(...) \
  25. tds_keywordify \
  26. metamacro_foreach_cxt(tds_weakify_,, __weak, __VA_ARGS__)
  27. #endif
  28. #ifndef strongify
  29. #define strongify(...) \
  30. tds_keywordify \
  31. _Pragma("clang diagnostic push") \
  32. _Pragma("clang diagnostic ignored \"-Wshadow\"") \
  33. metamacro_foreach(tds_strongify_,, __VA_ARGS__) \
  34. _Pragma("clang diagnostic pop")
  35. #endif
  36. #define tds_weakify_(INDEX, CONTEXT, VAR) \
  37. CONTEXT __typeof__(VAR) metamacro_concat(VAR, _weak_) = (VAR);
  38. #define tds_strongify_(INDEX, VAR) \
  39. __strong __typeof__(VAR) VAR = metamacro_concat(VAR, _weak_);
  40. #if DEBUG
  41. #define tds_keywordify autoreleasepool {}
  42. #else
  43. #define tds_keywordify try {} @catch (...) {}
  44. #endif
  45. #ifndef dispatch_main_async_safe
  46. #define dispatch_main_async_safe(block)\
  47. if (dispatch_queue_get_label(DISPATCH_CURRENT_QUEUE_LABEL) == dispatch_queue_get_label(dispatch_get_main_queue())) {\
  48. block();\
  49. } else {\
  50. dispatch_async(dispatch_get_main_queue(), block);\
  51. }
  52. #endif