YBIBDataMediator.m 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. //
  2. // YBIBDataMediator.m
  3. // YBImageBrowserDemo
  4. //
  5. // Created by 波儿菜 on 2019/6/6.
  6. // Copyright © 2019 波儿菜. All rights reserved.
  7. //
  8. #import "YBIBDataMediator.h"
  9. #import "YBImageBrowser+Internal.h"
  10. @implementation YBIBDataMediator {
  11. __weak YBImageBrowser *_browser;
  12. NSCache<NSNumber *, id<YBIBDataProtocol>> *_dataCache;
  13. }
  14. #pragma mark - life cycle
  15. - (instancetype)initWithBrowser:(YBImageBrowser *)browser {
  16. if (self = [super init]) {
  17. _browser = browser;
  18. _dataCache = [NSCache new];
  19. }
  20. return self;
  21. }
  22. #pragma mark - public
  23. - (NSInteger)numberOfCells {
  24. return _browser.dataSource ? [_browser.dataSource yb_numberOfCellsInImageBrowser:_browser] : _browser.dataSourceArray.count;
  25. }
  26. - (id<YBIBDataProtocol>)dataForCellAtIndex:(NSInteger)index {
  27. if (index < 0 || index > self.numberOfCells - 1) return nil;
  28. id<YBIBDataProtocol> data = [_dataCache objectForKey:@(index)];
  29. if (!data) {
  30. data = _browser.dataSource ? [_browser.dataSource yb_imageBrowser:_browser dataForCellAtIndex:index] : _browser.dataSourceArray[index];
  31. [_dataCache setObject:data forKey:@(index)];
  32. [_browser implementGetBaseInfoProtocol:data];
  33. }
  34. return data;
  35. }
  36. - (void)clear {
  37. [_dataCache removeAllObjects];
  38. }
  39. - (void)preloadWithPage:(NSInteger)page {
  40. if (_preloadCount == 0) return;
  41. NSInteger left = -(_preloadCount / 2), right = _preloadCount - ABS(left);
  42. for (NSInteger i = left; i <= right; ++i) {
  43. if (i == 0) continue;
  44. id<YBIBDataProtocol> targetData = [self dataForCellAtIndex:page + i];
  45. if ([targetData respondsToSelector:@selector(yb_preload)]) {
  46. [targetData yb_preload];
  47. }
  48. }
  49. }
  50. #pragma mark - getters & setters
  51. - (void)setDataCacheCountLimit:(NSUInteger)dataCacheCountLimit {
  52. _dataCacheCountLimit = dataCacheCountLimit;
  53. _dataCache.countLimit = dataCacheCountLimit;
  54. }
  55. @end