LKS_HierarchyDetailsHandler.m 4.3 KB

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