NIMGroupedData.m 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177
  1. //
  2. // NIMGroupedData.m
  3. // NIMKit
  4. //
  5. // Created by emily on 2017/7/26.
  6. // Copyright © 2017年 NetEase. All rights reserved.
  7. //
  8. #import "NIMGroupedData.h"
  9. @interface NIMKitPair : NSObject
  10. @property (nonatomic, strong) id first;
  11. @property (nonatomic, strong) id second;
  12. @end
  13. @implementation NIMKitPair
  14. - (instancetype)initWithFirst:(id)first second:(id)second {
  15. self = [super init];
  16. if(self) {
  17. _first = first;
  18. _second = second;
  19. }
  20. return self;
  21. }
  22. @end
  23. @interface NIMGroupedData ()
  24. @property(nonatomic, strong) NSMutableOrderedSet *groupTtiles;
  25. @property(nonatomic, strong) NSMutableOrderedSet *groups;
  26. @property (nonatomic, copy) NSComparator groupTitleComparator;
  27. @property (nonatomic, copy) NSComparator groupMemberComparator;
  28. @end
  29. @implementation NIMGroupedData
  30. - (instancetype)init {
  31. if (self = [super init]) {
  32. _members = @[].mutableCopy;
  33. _specialMembers = @[].mutableCopy;
  34. _groupTtiles = [[NSMutableOrderedSet alloc] init];
  35. _groups = [[NSMutableOrderedSet alloc] init];
  36. _groupTitleComparator = ^NSComparisonResult(NSString *title1, NSString *title2) {
  37. return [title1 localizedCompare:title2];
  38. };
  39. _groupMemberComparator = ^NSComparisonResult(NSString *key1, NSString *key2) {
  40. return [key1 localizedCompare:key2];
  41. };
  42. }
  43. return self;
  44. }
  45. - (void)setMembers:(NSArray *)members {
  46. NSMutableDictionary *tmp = [NSMutableDictionary dictionary];
  47. NSString *me = [[NIMSDK sharedSDK].loginManager currentAccount];
  48. for (id<NIMGroupMemberProtocol>member in members) {
  49. if ([[member memberId] isEqualToString:me]) {
  50. continue;
  51. }
  52. NSString *groupTitle = [member groupTitle];
  53. NSMutableArray *groupedMembers = [tmp objectForKey:groupTitle];
  54. if(!groupedMembers) {
  55. groupedMembers = [NSMutableArray array];
  56. }
  57. [groupedMembers addObject:member];
  58. [tmp setObject:groupedMembers forKey:groupTitle];
  59. }
  60. [_groupTtiles removeAllObjects];
  61. [_groups removeAllObjects];
  62. [tmp enumerateKeysAndObjectsUsingBlock:^(NSString *groupTitle, NSMutableArray *groupedMembers, BOOL *stop) {
  63. if (groupTitle.length) {
  64. unichar character = [groupTitle characterAtIndex:0];
  65. if (character >= 'A' && character <= 'Z') {
  66. [_groupTtiles addObject:groupTitle];
  67. }else{
  68. [_groupTtiles addObject:@"#"];
  69. }
  70. [_groups addObject:[[NIMKitPair alloc] initWithFirst:groupTitle second:groupedMembers]];
  71. }
  72. }];
  73. [self sortGroup];
  74. }
  75. - (void)setSpecialMembers:(NSArray *)specialMembers {
  76. if (specialMembers.count > 0) {
  77. _specialMembers = specialMembers;
  78. [_groups insertObject:[[NIMKitPair alloc] initWithFirst:@"$" second:specialMembers] atIndex:0];
  79. [self sortGroupMember];
  80. [_groupTtiles insertObject:@"$" atIndex:0];
  81. }
  82. }
  83. #pragma mark - Getter
  84. - (NSArray *)sectionTitles {
  85. return [_groupTtiles array];
  86. }
  87. - (NSDictionary *)contentDic {
  88. NSDictionary *dic = @{}.mutableCopy;
  89. for (int i = 0; i < _groups.count; ++i) {
  90. NSArray *tempArr = [self membersOfGroup:i];
  91. NSString *title = [self titleofGroup:i];
  92. [tempArr enumerateObjectsUsingBlock:^(id<NIMGroupMemberProtocol>member, NSUInteger idx, BOOL * _Nonnull stop) {
  93. NSMutableArray *arr = [dic valueForKey:title];
  94. if (!arr) {
  95. arr = @[].mutableCopy;
  96. [dic setValue:arr forKey:title];
  97. }
  98. [arr addObject:member];
  99. }];
  100. }
  101. return dic;
  102. }
  103. #pragma mark - Private
  104. - (NSString *)titleofGroup:(NSInteger)groupIndex {
  105. if(groupIndex >= 0 && groupIndex < _groupTtiles.count) {
  106. return [_groupTtiles objectAtIndex:groupIndex];
  107. }
  108. return nil;
  109. }
  110. - (NSArray *)membersOfGroup:(NSInteger)groupIndex
  111. {
  112. if(groupIndex >= 0 && groupIndex < _groups.count) {
  113. NIMKitPair *pair = [_groups objectAtIndex:groupIndex];
  114. return pair.second;
  115. }
  116. return nil;
  117. }
  118. - (void)sortGroup
  119. {
  120. [self sortGroupTitle];
  121. [self sortGroupMember];
  122. }
  123. - (void)sortGroupTitle
  124. {
  125. [_groupTtiles sortUsingComparator:_groupTitleComparator];
  126. [_groups sortUsingComparator:^NSComparisonResult(NIMKitPair *pair1, NIMKitPair *pair2) {
  127. return _groupTitleComparator(pair1.first, pair2.first);
  128. }];
  129. }
  130. - (void)sortGroupMember
  131. {
  132. [_groups enumerateObjectsUsingBlock:^(NIMKitPair *obj, NSUInteger idx, BOOL *stop) {
  133. NSMutableArray *groupedMembers = obj.second;
  134. [groupedMembers sortUsingComparator:^NSComparisonResult(id<NIMGroupMemberProtocol> member1, id<NIMGroupMemberProtocol> member2) {
  135. return _groupMemberComparator([member1 sortKey], [member2 sortKey]);
  136. }];
  137. }];
  138. }
  139. - (void)setGroupTitleComparator:(NSComparator)groupTitleComparator
  140. {
  141. _groupTitleComparator = groupTitleComparator;
  142. [self sortGroupTitle];
  143. }
  144. - (void)setGroupMemberComparator:(NSComparator)groupMemberComparator
  145. {
  146. _groupMemberComparator = groupMemberComparator;
  147. [self sortGroupMember];
  148. }
  149. @end