LKS_HierarchyDetailsHandler.m 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  1. #ifdef SHOULD_COMPILE_LOOKIN_SERVER
  2. //
  3. // LKS_HierarchyDetailsHandler.m
  4. // LookinServer
  5. //
  6. // Created by Li Kai on 2019/6/20.
  7. // https://lookin.work
  8. //
  9. #import "LKS_HierarchyDetailsHandler.h"
  10. #import "LookinDisplayItemDetail.h"
  11. #import "LKS_AttrGroupsMaker.h"
  12. #import "LookinStaticAsyncUpdateTask.h"
  13. #import "LKS_ConnectionManager.h"
  14. #import "LookinServerDefines.h"
  15. @interface LKS_HierarchyDetailsHandler ()
  16. @property(nonatomic, strong) NSMutableArray<LookinStaticAsyncUpdateTasksPackage *> *taskPackages;
  17. @property(nonatomic, strong) NSMutableSet<LookinStaticAsyncUpdateTask *> *finishedTasks;
  18. /// 标识哪些 oid 已经拉取过 attrGroups 了
  19. @property(nonatomic, strong) NSMutableSet<NSNumber *> *attrGroupsSyncedOids;
  20. @property(nonatomic, copy) LKS_HierarchyDetailsHandler_Block handlerBlock;
  21. @property(nonatomic, assign) NSUInteger bbb;
  22. @end
  23. @implementation LKS_HierarchyDetailsHandler
  24. + (instancetype)sharedInstance {
  25. static dispatch_once_t onceToken;
  26. static LKS_HierarchyDetailsHandler *instance = nil;
  27. dispatch_once(&onceToken,^{
  28. instance = [[super allocWithZone:NULL] init];
  29. });
  30. return instance;
  31. }
  32. + (id)allocWithZone:(struct _NSZone *)zone{
  33. return [self sharedInstance];
  34. }
  35. - (instancetype)init {
  36. if (self = [super init]) {
  37. [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(_handleConnectionDidEnd:) name:LKS_ConnectionDidEndNotificationName object:nil];
  38. self.attrGroupsSyncedOids = [NSMutableSet set];
  39. self.finishedTasks = [NSMutableSet set];
  40. }
  41. return self;
  42. }
  43. - (void)startWithPackages:(NSArray<LookinStaticAsyncUpdateTasksPackage *> *)packages block:(LKS_HierarchyDetailsHandler_Block)block {
  44. if (!block) {
  45. NSAssert(NO, @"");
  46. return;
  47. }
  48. if (!packages.count) {
  49. block(nil, LookinErr_Inner);
  50. return;
  51. }
  52. [self.finishedTasks removeAllObjects];
  53. [self.attrGroupsSyncedOids removeAllObjects];
  54. self.taskPackages = [packages mutableCopy];
  55. self.handlerBlock = block;
  56. [UIView lks_rebuildGlobalInvolvedRawConstraints];
  57. [self _dequeueAndHandlePackage];
  58. }
  59. - (void)bringForwardWithPackages:(NSArray<LookinStaticAsyncUpdateTasksPackage *> *)packages {
  60. NSLog(@"LookinServer - willBringForward");
  61. NSIndexSet *indexSet = [NSIndexSet indexSetWithIndexesInRange:NSMakeRange(0, packages.count)];
  62. [self.taskPackages insertObjects:packages atIndexes:indexSet];
  63. }
  64. - (void)cancel {
  65. [self.taskPackages removeAllObjects];
  66. }
  67. - (void)_dequeueAndHandlePackage {
  68. dispatch_async(dispatch_get_main_queue(), ^{
  69. LookinStaticAsyncUpdateTasksPackage *package = self.taskPackages.firstObject;
  70. if (!package) {
  71. return;
  72. }
  73. // NSLog(@"LookinServer - will handle tasks, count: %@", @(tasks.count));
  74. NSArray<LookinDisplayItemDetail *> *details = [package.tasks lookin_map:^id(NSUInteger idx, LookinStaticAsyncUpdateTask *task) {
  75. if ([self.finishedTasks containsObject:task]) {
  76. return nil;
  77. }
  78. [self.finishedTasks addObject:task];
  79. LookinDisplayItemDetail *itemDetail = [LookinDisplayItemDetail new];
  80. itemDetail.displayItemOid = task.oid;
  81. id object = [NSObject lks_objectWithOid:task.oid];
  82. if (!object || ![object isKindOfClass:[CALayer class]]) {
  83. return itemDetail;
  84. }
  85. CALayer *layer = object;
  86. if (![self.attrGroupsSyncedOids containsObject:@(task.oid)]) {
  87. itemDetail.attributesGroupList = [LKS_AttrGroupsMaker attrGroupsForLayer:layer];
  88. [self.attrGroupsSyncedOids addObject:@(task.oid)];
  89. }
  90. if (task.taskType == LookinStaticAsyncUpdateTaskTypeSoloScreenshot) {
  91. UIImage *image = [layer lks_soloScreenshotWithLowQuality:NO];
  92. itemDetail.soloScreenshot = image;
  93. } else if (task.taskType == LookinStaticAsyncUpdateTaskTypeGroupScreenshot) {
  94. UIImage *image = [layer lks_groupScreenshotWithLowQuality:NO];
  95. itemDetail.groupScreenshot = image;
  96. }
  97. return itemDetail;
  98. }];
  99. self.handlerBlock(details, nil);
  100. [self.taskPackages removeObjectAtIndex:0];
  101. [self _dequeueAndHandlePackage];
  102. });
  103. }
  104. - (void)_handleConnectionDidEnd:(id)obj {
  105. [self cancel];
  106. }
  107. @end
  108. #endif /* SHOULD_COMPILE_LOOKIN_SERVER */