/Pods/QMServices/QMUsersService/QMUsersService/QMUsersService.m

https://gitlab.com/wideweb/chat_chistyakov_ios · Objective C · 348 lines · 255 code · 82 blank · 11 comment · 21 complexity · 2dceac7db6e84a08acb40f1039f8ade9 MD5 · raw file

  1. //
  2. // QMUsersService.m
  3. // QMUsersService
  4. //
  5. // Created by Andrey Moskvin on 10/23/15.
  6. // Copyright © 2015 Quickblox. All rights reserved.
  7. //
  8. #import "QMUsersService.h"
  9. @interface QMUsersService () <QBChatDelegate>
  10. @property (strong, nonatomic) QBMulticastDelegate <QMUsersServiceDelegate> *multicastDelegate;
  11. @property (strong, nonatomic) QMUsersMemoryStorage *usersMemoryStorage;
  12. @property (weak, nonatomic) id<QMUsersServiceCacheDataSource> cacheDataSource;
  13. @end
  14. @implementation QMUsersService {
  15. BFTask* loadFromCacheTask;
  16. }
  17. - (void)dealloc {
  18. NSLog(@"%@ - %@", NSStringFromSelector(_cmd), self);
  19. [[QBChat instance] removeDelegate:self];
  20. self.usersMemoryStorage = nil;
  21. }
  22. - (instancetype)initWithServiceManager:(id<QMServiceManagerProtocol>)serviceManager cacheDataSource:(id<QMUsersServiceCacheDataSource>)cacheDataSource
  23. {
  24. self = [super initWithServiceManager:serviceManager];
  25. if (self) {
  26. self.cacheDataSource = cacheDataSource;
  27. }
  28. return self;
  29. }
  30. - (void)serviceWillStart
  31. {
  32. self.multicastDelegate = (id<QMUsersServiceDelegate>)[[QBMulticastDelegate alloc] init];
  33. self.usersMemoryStorage = [[QMUsersMemoryStorage alloc] init];
  34. }
  35. #pragma mark - Tasks
  36. - (BFTask *)loadFromCache
  37. {
  38. if (loadFromCacheTask == nil) {
  39. BFTaskCompletionSource* source = [BFTaskCompletionSource taskCompletionSource];
  40. if ([self.cacheDataSource respondsToSelector:@selector(cachedUsers:)]) {
  41. __weak __typeof(self)weakSelf = self;
  42. [self.cacheDataSource cachedUsers:^(NSArray *collection) {
  43. [weakSelf.usersMemoryStorage addUsers:collection];
  44. [source setResult:collection];
  45. }];
  46. loadFromCacheTask = source.task;
  47. return loadFromCacheTask;
  48. } else {
  49. loadFromCacheTask = [BFTask taskWithResult:nil];
  50. }
  51. }
  52. return loadFromCacheTask;
  53. }
  54. #pragma mark - Add Remove multicaste delegate
  55. - (void)addDelegate:(id <QMUsersServiceDelegate>)delegate {
  56. [self.multicastDelegate addDelegate:delegate];
  57. }
  58. - (void)removeDelegate:(id <QMUsersServiceDelegate>)delegate {
  59. [self.multicastDelegate removeDelegate:delegate];
  60. }
  61. #pragma mark - Retrive users
  62. - (BFTask *)getUserWithID:(NSUInteger)userID
  63. {
  64. return (BFTask *)[[self getUsersWithIDs:@[@(userID)]] continueWithBlock:^id(BFTask *task) {
  65. return [BFTask taskWithResult:[task.result firstObject]];
  66. }];
  67. }
  68. - (BFTask *)getUsersWithIDs:(NSArray *)usersIDs
  69. {
  70. QBGeneralResponsePage *pageResponse =
  71. [QBGeneralResponsePage responsePageWithCurrentPage:1 perPage:usersIDs.count < 100 ? usersIDs.count : 100];
  72. return [self getUsersWithIDs:usersIDs page:pageResponse];
  73. }
  74. - (BFTask *)getUsersWithIDs:(NSArray *)usersIDs page:(QBGeneralResponsePage *)page
  75. {
  76. NSParameterAssert(usersIDs);
  77. NSParameterAssert(page);
  78. __weak __typeof(self)weakSelf = self;
  79. return [[self loadFromCache] continueWithBlock:^id(BFTask *task) {
  80. __typeof(weakSelf)strongSelf = weakSelf;
  81. NSDictionary* searchInfo = [strongSelf.usersMemoryStorage usersByExcludingUsersIDs:usersIDs];
  82. NSArray* foundUsers = searchInfo[QMUsersSearchKey.foundObjects];
  83. if ([searchInfo[QMUsersSearchKey.notFoundSearchValues] count] == 0) {
  84. return [BFTask taskWithResult:foundUsers];
  85. }
  86. return [strongSelf getUsersWithIDs:searchInfo[QMUsersSearchKey.notFoundSearchValues]
  87. foundUsers:foundUsers
  88. forceDownload:YES
  89. page:page];
  90. }];
  91. }
  92. - (BFTask *)getUsersWithIDs:(NSArray *)ids foundUsers:(NSArray *)foundUsers forceDownload:(BOOL)forceDownload page:(QBGeneralResponsePage *)page
  93. {
  94. if (ids.count == 0) {
  95. return [BFTask taskWithResult:foundUsers];
  96. }
  97. __weak __typeof(self)weakSelf = self;
  98. return [[self loadFromCache] continueWithBlock:^id(BFTask *task) {
  99. __typeof(weakSelf)strongSelf = weakSelf;
  100. BFTaskCompletionSource* source = [BFTaskCompletionSource taskCompletionSource];
  101. [QBRequest usersWithIDs:ids page:page successBlock:^(QBResponse *response, QBGeneralResponsePage *page, NSArray * users) {
  102. [strongSelf.usersMemoryStorage addUsers:users];
  103. if ([strongSelf.multicastDelegate respondsToSelector:@selector(usersService:didAddUsers:)]) {
  104. [strongSelf.multicastDelegate usersService:strongSelf didAddUsers:users];
  105. }
  106. [source setResult:[foundUsers arrayByAddingObjectsFromArray:users]];
  107. } errorBlock:^(QBResponse *response) {
  108. [source setError:response.error.error];
  109. }];
  110. return source.task;
  111. }];
  112. }
  113. - (BFTask *)getUsersWithEmails:(NSArray *)emails
  114. {
  115. return [self getUsersWithEmails:emails page:[QBGeneralResponsePage responsePageWithCurrentPage:1 perPage:100]];
  116. }
  117. - (BFTask *)getUsersWithEmails:(NSArray *)emails page:(QBGeneralResponsePage *)page
  118. {
  119. NSParameterAssert(emails);
  120. NSParameterAssert(page);
  121. __weak __typeof(self)weakSelf = self;
  122. return [[self loadFromCache] continueWithBlock:^id(BFTask *task) {
  123. __typeof(weakSelf)strongSelf = weakSelf;
  124. NSDictionary* searchInfo = [strongSelf.usersMemoryStorage usersByExcludingEmails:emails];
  125. NSArray* foundUsers = searchInfo[QMUsersSearchKey.foundObjects];
  126. if ([searchInfo[QMUsersSearchKey.notFoundSearchValues] count] == 0) {
  127. return [BFTask taskWithResult:foundUsers];
  128. }
  129. BFTaskCompletionSource* source = [BFTaskCompletionSource taskCompletionSource];
  130. [QBRequest usersWithEmails:searchInfo[QMUsersSearchKey.notFoundSearchValues]
  131. page:page
  132. successBlock:^(QBResponse *response, QBGeneralResponsePage *page, NSArray *users) {
  133. //
  134. [strongSelf.usersMemoryStorage addUsers:users];
  135. if ([strongSelf.multicastDelegate respondsToSelector:@selector(usersService:didAddUsers:)]) {
  136. [strongSelf.multicastDelegate usersService:strongSelf didAddUsers:users];
  137. }
  138. [source setResult:[foundUsers arrayByAddingObjectsFromArray:users]];
  139. } errorBlock:^(QBResponse *response) {
  140. //
  141. [source setError:response.error.error];
  142. }];
  143. return source.task;
  144. }];
  145. }
  146. - (BFTask *)getUsersWithFacebookIDs:(NSArray *)facebookIDs
  147. {
  148. QBGeneralResponsePage *pageResponse =
  149. [QBGeneralResponsePage responsePageWithCurrentPage:1 perPage:facebookIDs.count < 100 ? facebookIDs.count : 100];
  150. return [self getUsersWithFacebookIDs:facebookIDs page:pageResponse];
  151. }
  152. - (BFTask *)getUsersWithFacebookIDs:(NSArray *)facebookIDs page:(QBGeneralResponsePage *)page
  153. {
  154. NSParameterAssert(facebookIDs);
  155. NSParameterAssert(page);
  156. __weak __typeof(self)weakSelf = self;
  157. return [[self loadFromCache] continueWithBlock:^id(BFTask *task) {
  158. __typeof(weakSelf)strongSelf = weakSelf;
  159. NSDictionary* searchInfo = [strongSelf.usersMemoryStorage usersByExcludingFacebookIDs:facebookIDs];
  160. NSArray* foundUsers = searchInfo[QMUsersSearchKey.foundObjects];
  161. if ([searchInfo[QMUsersSearchKey.notFoundSearchValues] count] == 0) {
  162. return [BFTask taskWithResult:foundUsers];
  163. }
  164. BFTaskCompletionSource* source = [BFTaskCompletionSource taskCompletionSource];
  165. [QBRequest usersWithFacebookIDs:searchInfo[QMUsersSearchKey.notFoundSearchValues]
  166. page:page
  167. successBlock:^(QBResponse *response, QBGeneralResponsePage *page, NSArray *users) {
  168. [strongSelf.usersMemoryStorage addUsers:users];
  169. if ([strongSelf.multicastDelegate respondsToSelector:@selector(usersService:didAddUsers:)]) {
  170. [strongSelf.multicastDelegate usersService:strongSelf didAddUsers:users];
  171. }
  172. [source setResult:[foundUsers arrayByAddingObjectsFromArray:users]];
  173. } errorBlock:^(QBResponse *response) {
  174. [source setError:response.error.error];
  175. }];
  176. return source.task;
  177. }];
  178. }
  179. - (BFTask *)getUsersWithLogins:(NSArray *)logins
  180. {
  181. QBGeneralResponsePage *pageResponse =
  182. [QBGeneralResponsePage responsePageWithCurrentPage:1 perPage:logins.count < 100 ? logins.count : 100];
  183. return [self getUsersWithLogins:logins page:pageResponse];
  184. }
  185. - (BFTask *)getUsersWithLogins:(NSArray *)logins page:(QBGeneralResponsePage *)page
  186. {
  187. NSParameterAssert(logins);
  188. NSParameterAssert(page);
  189. __weak __typeof(self)weakSelf = self;
  190. return [[self loadFromCache] continueWithBlock:^id(BFTask *task) {
  191. __typeof(weakSelf)strongSelf = weakSelf;
  192. NSDictionary* searchInfo = [strongSelf.usersMemoryStorage usersByExcludingLogins:logins];
  193. NSArray* foundUsers = searchInfo[QMUsersSearchKey.foundObjects];
  194. if ([searchInfo[QMUsersSearchKey.notFoundSearchValues] count] == 0) {
  195. return [BFTask taskWithResult:foundUsers];
  196. }
  197. BFTaskCompletionSource* source = [BFTaskCompletionSource taskCompletionSource];
  198. [QBRequest usersWithLogins:searchInfo[QMUsersSearchKey.notFoundSearchValues]
  199. page:page
  200. successBlock:^(QBResponse *response, QBGeneralResponsePage *page, NSArray *users) {
  201. [strongSelf.usersMemoryStorage addUsers:users];
  202. if ([strongSelf.multicastDelegate respondsToSelector:@selector(usersService:didAddUsers:)]) {
  203. [strongSelf.multicastDelegate usersService:strongSelf didAddUsers:users];
  204. }
  205. [source setResult:[foundUsers arrayByAddingObjectsFromArray:users]];
  206. } errorBlock:^(QBResponse *response) {
  207. [source setError:response.error.error];
  208. }];
  209. return source.task;
  210. }];
  211. }
  212. #pragma mark - Search
  213. - (BFTask *)searchUsersWithFullName:(NSString *)searchText
  214. {
  215. return [self searchUsersWithFullName:searchText page:[QBGeneralResponsePage responsePageWithCurrentPage:1 perPage:100]];
  216. }
  217. - (BFTask *)searchUsersWithFullName:(NSString *)searchText page:(QBGeneralResponsePage *)page
  218. {
  219. NSParameterAssert(searchText);
  220. NSParameterAssert(page);
  221. __weak __typeof(self)weakSelf = self;
  222. return [[self loadFromCache] continueWithBlock:^id(BFTask *task) {
  223. __typeof(weakSelf)strongSelf = weakSelf;
  224. BFTaskCompletionSource* source = [BFTaskCompletionSource taskCompletionSource];
  225. [QBRequest usersWithFullName:searchText page:page
  226. successBlock:^(QBResponse *response, QBGeneralResponsePage *page, NSArray *users) {
  227. [strongSelf.usersMemoryStorage addUsers:users];
  228. if ([strongSelf.multicastDelegate respondsToSelector:@selector(usersService:didAddUsers:)]) {
  229. [strongSelf.multicastDelegate usersService:strongSelf didAddUsers:users];
  230. }
  231. [source setResult:users];
  232. } errorBlock:^(QBResponse *response) {
  233. [source setError:response.error.error];
  234. }];
  235. return source.task;
  236. }];
  237. }
  238. - (BFTask *)searchUsersWithTags:(NSArray *)tags
  239. {
  240. return [self searchUsersWithTags:tags page:[QBGeneralResponsePage responsePageWithCurrentPage:1 perPage:100]];
  241. }
  242. - (BFTask *)searchUsersWithTags:(NSArray *)tags page:(QBGeneralResponsePage *)page
  243. {
  244. NSParameterAssert(tags);
  245. NSParameterAssert(page);
  246. __weak __typeof(self)weakSelf = self;
  247. return [[self loadFromCache] continueWithBlock:^id(BFTask *task) {
  248. __typeof(weakSelf)strongSelf = weakSelf;
  249. BFTaskCompletionSource* source = [BFTaskCompletionSource taskCompletionSource];
  250. [QBRequest usersWithTags:tags
  251. page:page
  252. successBlock:^(QBResponse *response, QBGeneralResponsePage *page, NSArray *users) {
  253. //
  254. [strongSelf.usersMemoryStorage addUsers:users];
  255. if ([strongSelf.multicastDelegate respondsToSelector:@selector(usersService:didAddUsers:)]) {
  256. [strongSelf.multicastDelegate usersService:strongSelf didAddUsers:users];
  257. }
  258. [source setResult:users];
  259. } errorBlock:^(QBResponse *response) {
  260. //
  261. [source setError:response.error.error];
  262. }];
  263. return source.task;
  264. }];
  265. }
  266. @end