LookinMsgAttribute.m 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195
  1. #ifdef SHOULD_COMPILE_LOOKIN_SERVER
  2. //
  3. // LookinMsgAttribute.m
  4. // Lookin
  5. //
  6. // Created by Li Kai on 2019/8/19.
  7. // https://lookin.work
  8. //
  9. #import "LookinMsgAttribute.h"
  10. #import "LookinMsgTargetAction.h"
  11. @implementation LookinMsgActionParams
  12. - (double)doubleValue {
  13. if (![self.value isKindOfClass:[NSNumber class]]) {
  14. NSAssert(NO, @"");
  15. return 0;
  16. }
  17. return ((NSNumber *)self.value).doubleValue;
  18. }
  19. - (NSInteger)integerValue {
  20. if (![self.value isKindOfClass:[NSNumber class]]) {
  21. NSAssert(NO, @"");
  22. return 0;
  23. }
  24. return ((NSNumber *)self.value).integerValue;
  25. }
  26. - (BOOL)boolValue {
  27. if (![self.value isKindOfClass:[NSNumber class]]) {
  28. NSAssert(NO, @"");
  29. return 0;
  30. }
  31. return ((NSNumber *)self.value).boolValue;
  32. }
  33. @end
  34. @interface LookinMsgAttribute ()
  35. @property(nonatomic, strong, readwrite) id currentValue;
  36. @property(nonatomic, strong) NSMutableArray<LookinMsgTargetAction *> *subscribers;
  37. @end
  38. @implementation LookinMsgAttribute
  39. + (instancetype)attributeWithValue:(id)value {
  40. LookinMsgAttribute *attr = [LookinMsgAttribute new];
  41. attr.currentValue = value;
  42. return attr;
  43. }
  44. - (instancetype)init {
  45. if (self = [super init]) {
  46. self.subscribers = [NSMutableArray array];
  47. }
  48. return self;
  49. }
  50. - (void)setValue:(id)value ignoreSubscriber:(id)ignoreSubscriber userInfo:(id)userInfo {
  51. if ([self.currentValue isEqual:value]) {
  52. // value 相等的话直接拒绝
  53. return;
  54. }
  55. self.currentValue = value;
  56. __block NSMutableIndexSet *invalidIdxs = nil;
  57. [self.subscribers enumerateObjectsUsingBlock:^(LookinMsgTargetAction * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
  58. id subscriberTarget = obj.target;
  59. SEL subscriberAction = obj.action;
  60. if (!subscriberTarget) {
  61. // target 已被释放,删掉这组 target-action 吧
  62. if (!invalidIdxs) {
  63. invalidIdxs = [NSMutableIndexSet indexSet];
  64. }
  65. [invalidIdxs addIndex:idx];
  66. return;
  67. }
  68. if (subscriberTarget == ignoreSubscriber) {
  69. // 不要通知 ignoreSubscriber
  70. return;
  71. }
  72. LookinMsgActionParams *params = [LookinMsgActionParams new];
  73. params.userInfo = userInfo;
  74. params.value = value;
  75. params.relatedObject = obj.relatedObject;
  76. #if TARGET_OS_IPHONE
  77. [[UIApplication sharedApplication] sendAction:subscriberAction to:subscriberTarget from:params forEvent:nil];
  78. #elif TARGET_OS_MAC
  79. [NSApp sendAction:subscriberAction to:subscriberTarget from:params];
  80. #endif
  81. }];
  82. if (invalidIdxs.count) {
  83. [self.subscribers removeObjectsAtIndexes:invalidIdxs];
  84. }
  85. }
  86. - (void)subscribe:(id)target action:(SEL)action relatedObject:(id)relatedObject {
  87. [self subscribe:target action:action relatedObject:relatedObject sendAtOnce:NO];
  88. }
  89. - (void)subscribe:(id)target action:(SEL)action relatedObject:(id)relatedObject sendAtOnce:(BOOL)sendAtOnce {
  90. if (!target || !action) {
  91. return;
  92. }
  93. LookinMsgTargetAction *newOne = [LookinMsgTargetAction new];
  94. newOne.target = target;
  95. newOne.action = action;
  96. newOne.relatedObject = relatedObject;
  97. if ([self.subscribers containsObject:newOne]) {
  98. return;
  99. }
  100. [self.subscribers addObject:newOne];
  101. if (sendAtOnce) {
  102. LookinMsgActionParams *params = [LookinMsgActionParams new];
  103. params.value = self.currentValue;
  104. params.relatedObject = relatedObject;
  105. #if TARGET_OS_IPHONE
  106. [[UIApplication sharedApplication] sendAction:action to:target from:params forEvent:nil];
  107. #elif TARGET_OS_MAC
  108. [NSApp sendAction:action to:target from:params];
  109. #endif
  110. }
  111. }
  112. @end
  113. @implementation LookinDoubleMsgAttribute
  114. + (instancetype)attributeWithDouble:(double)value {
  115. LookinDoubleMsgAttribute *attr = [LookinDoubleMsgAttribute new];
  116. attr.currentValue = @(value);
  117. return attr;
  118. }
  119. - (void)setDoubleValue:(double)doubleValue ignoreSubscriber:(id)ignoreSubscriber {
  120. [self setValue:@(doubleValue) ignoreSubscriber:ignoreSubscriber userInfo:nil];
  121. }
  122. - (double)currentDoubleValue {
  123. return ((NSNumber *)self.currentValue).doubleValue;
  124. }
  125. @end
  126. @implementation LookinIntegerMsgAttribute
  127. + (instancetype)attributeWithInteger:(NSInteger)value {
  128. LookinIntegerMsgAttribute *attr = [LookinIntegerMsgAttribute new];
  129. attr.currentValue = @(value);
  130. return attr;
  131. }
  132. - (void)setIntegerValue:(NSInteger)integerValue ignoreSubscriber:(id)ignoreSubscriber {
  133. [self setValue:@(integerValue) ignoreSubscriber:ignoreSubscriber userInfo:nil];
  134. }
  135. - (NSInteger)currentIntegerValue {
  136. return ((NSNumber *)self.currentValue).integerValue;
  137. }
  138. @end
  139. @implementation LookinBOOLMsgAttribute
  140. + (instancetype)attributeWithBOOL:(BOOL)value {
  141. LookinBOOLMsgAttribute *attr = [LookinBOOLMsgAttribute new];
  142. attr.currentValue = @(value);
  143. return attr;
  144. }
  145. - (void)setBOOLValue:(BOOL)BOOLValue ignoreSubscriber:(id)ignoreSubscriber {
  146. [self setValue:@(BOOLValue) ignoreSubscriber:ignoreSubscriber userInfo:nil];
  147. }
  148. - (BOOL)currentBOOLValue {
  149. return ((NSNumber *)self.currentValue).boolValue;
  150. }
  151. @end
  152. #endif /* SHOULD_COMPILE_LOOKIN_SERVER */