RQDspVideoDetailViewModel.m 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181
  1. //
  2. // RQDspVideoDetailViewModel.m
  3. // JSJP
  4. //
  5. // Created by RONGQING on 2022/1/19.
  6. //
  7. #import "RQDspVideoDetailViewModel.h"
  8. #import <ADSuyiSDK/ADSuyiSDKDrawvodAd.h>
  9. #import <ADSuyiSDK/ADSuyiAdapterDrawvodAdView.h>
  10. @interface RQDspVideoDetailViewModel () <ADSuyiSDKDrawvodAdDelegate>
  11. @property (nonatomic, readwrite, strong) NSArray *videosItemArr;
  12. @property (nonatomic, readwrite, strong) NSIndexPath *indexPath;
  13. @property (nonatomic, readwrite, strong) ADSuyiSDKDrawvodAd *drawvodAd;
  14. @property (nonatomic, strong) NSMutableArray<ADSuyiAdapterDrawvodAdView *> *data;
  15. @property (nonatomic, readwrite, strong) VideosItem *lastVideoItem;
  16. @end
  17. @implementation RQDspVideoDetailViewModel
  18. #pragma mark - Public Method
  19. - (instancetype)initWithServices:(id<RQViewModelServices>)services params:(NSDictionary *)params {
  20. if (self = [super initWithServices:services params:params]) {
  21. self.videosItemArr = RQ_COMMON_MANAGER.dspListArr;
  22. self.indexPath = params[RQViewCommonValueKey];
  23. }
  24. return self;
  25. }
  26. - (void)dealloc {
  27. for (ADSuyiAdapterDrawvodAdView *adview in self.data) {
  28. // 5、广告内存回收
  29. [adview unRegist];
  30. }
  31. }
  32. - (void)initialize {
  33. [super initialize];
  34. /// 允许下拉刷新
  35. self.shouldPullDownToRefresh = YES;
  36. /// 允许上拉加载
  37. self.shouldPullUpToLoadMore = YES;
  38. self.prefersNavigationBarHidden = YES;
  39. self.perPage = 10;
  40. @weakify(self);
  41. /// 消息列表
  42. RAC(self, videosItemArr) = self.requestRemoteDataCommand.executionSignals.switchToLatest;
  43. /// 数据源
  44. RAC(self, dataSource) = [RACObserve(self, videosItemArr) map:^(NSArray * videosItemArr) {
  45. @strongify(self)
  46. return [self dataSourceWithVideosItems:videosItemArr];
  47. }];
  48. }
  49. #pragma mark - PrivateMethod
  50. // 请求数据
  51. - (RACSignal *)requestRemoteDataSignalWithPage:(NSUInteger)page {
  52. @weakify(self)
  53. NSArray * (^videosItemsBlock)(NSArray *) = ^(NSArray *products) {
  54. @strongify(self)
  55. [MBProgressHUD rq_hideHUD];
  56. if (page == 1) {
  57. /// 下拉刷新
  58. } else {
  59. /// 上拉加载
  60. products = @[(self.videosItemArr ?: @[]).rac_sequence, products.rac_sequence].rac_sequence.flatten.array;
  61. }
  62. return products;
  63. };
  64. return [[[self.services.client getDspListWithPageNum:page pageSize:self.perPage] map:videosItemsBlock] doError:^(NSError * _Nonnull error) {
  65. [MBProgressHUD rq_showErrorTips:error];
  66. }];
  67. }
  68. #pragma mark - 辅助方法
  69. - (NSArray *)dataSourceWithVideosItems:(NSArray *)videosItemArr {
  70. if (RQObjectIsNil(videosItemArr) || videosItemArr.count == 0) return nil;
  71. NSArray *viewModels = [videosItemArr.rac_sequence map:^(VideosItem *videosItem) {
  72. RQCommonGroupViewModel *group = [RQCommonGroupViewModel groupViewModel];
  73. videosItem.index = [videosItemArr indexOfObject:videosItem] + 1;
  74. videosItem.totalNum = videosItemArr.count;
  75. RQDspVideoDetailItemViewModel *dspVideoDetailItemViewModel = [[RQDspVideoDetailItemViewModel alloc] initWithVideosItem:videosItem];
  76. dspVideoDetailItemViewModel.rowHeight = RQ_SCREEN_HEIGHT;
  77. dspVideoDetailItemViewModel.operation = ^{
  78. };
  79. group.itemViewModels = @[dspVideoDetailItemViewModel];
  80. return group;
  81. }].array;
  82. [self loadDrawvodAd];
  83. return viewModels ?: @[] ;
  84. }
  85. - (void)loadDrawvodAd {
  86. // 2、加载沉浸式视频广告
  87. [self.drawvodAd load:4];
  88. }
  89. #pragma mark - ADSuyiSDKDrawvodAdDelegate
  90. - (void)adsy_drawvodAdSuccessToLoad:(ADSuyiSDKDrawvodAd *)drawvodAd drawvodAdArray:(NSArray<ADSuyiAdapterDrawvodAdView *> *)drawvodAdViewArray {
  91. for (ADSuyiAdapterDrawvodAdView *adView in drawvodAdViewArray) {
  92. // 3、渲染沉浸式广告
  93. [adView render];
  94. }
  95. }
  96. - (void)adsy_drawvodAdFailToLoad:(ADSuyiSDKDrawvodAd *)drawvodAd errorModel:(ADSuyiAdapterErrorDefine *)errorModel {
  97. }
  98. - (void)adsy_drawvodAdSuccessToRender:(ADSuyiSDKDrawvodAd *)drawvodAd view:(ADSuyiAdapterDrawvodAdView *)drawvodAdView {
  99. // 4、渲染成功,此时高度正常,资源加载中,可'展示
  100. NSMutableArray *dataSourceArr = [NSMutableArray arrayWithArray:self.dataSource];
  101. [self.data addObject:drawvodAdView];
  102. NSInteger i = 8;
  103. if (self.lastVideoItem) {
  104. if (self.lastVideoItem.index < dataSourceArr.count) {
  105. i = self.lastVideoItem.index + arc4random() % (dataSourceArr.count - self.lastVideoItem.index) + 4;
  106. } else {
  107. return;
  108. }
  109. } else {
  110. i = (dataSourceArr.count > 6)? 6 + arc4random() % (dataSourceArr.count - 6) : 0;
  111. }
  112. if (i > dataSourceArr.count) {
  113. return;
  114. }
  115. // VideosItem *videoItem = dataSourceArr[i];
  116. // videoItem.index = i;
  117. // videoItem.totalNum = dataSourceArr.count + 1;
  118. RQCommonGroupViewModel *group = dataSourceArr[i];
  119. RQDspVideoDetailItemViewModel *dspVideoDetailItemViewModel = group.itemViewModels.firstObject;
  120. dspVideoDetailItemViewModel.videosItem.adView = drawvodAdView;
  121. dspVideoDetailItemViewModel.rowHeight = RQ_SCREEN_HEIGHT;
  122. dspVideoDetailItemViewModel.operation = ^{
  123. };
  124. group.itemViewModels = @[dspVideoDetailItemViewModel];
  125. [dataSourceArr replaceObjectAtIndex:i withObject:group];
  126. self.dataSource = dataSourceArr.copy;
  127. self.lastVideoItem = dspVideoDetailItemViewModel.videosItem;
  128. }
  129. - (void)adsy_drawvodAdFailToRender:(ADSuyiSDKDrawvodAd *)drawvodAd view:(ADSuyiAdapterDrawvodAdView *)drawvodAdView error:(nullable NSError *)error {
  130. }
  131. - (void)adsy_drawvodAdPlayerDidPlayFinish:(ADSuyiAdapterDrawvodAdView *)drawvodAdView {
  132. }
  133. - (void)adsy_drawvodAdDidExposure:(ADSuyiAdapterDrawvodAdView *)drawvodAdView {
  134. }
  135. - (void)adsy_drawvodAdDidClick:(ADSuyiAdapterDrawvodAdView *)drawvodAdView {
  136. }
  137. #pragma mark - LazyLoad
  138. - (ADSuyiSDKDrawvodAd *)drawvodAd {
  139. if(!_drawvodAd) {
  140. // 1、初始化沉浸式视频广告,流程和信息流广告类似
  141. _drawvodAd = [[ADSuyiSDKDrawvodAd alloc] initWithSize:RQControllerHelper.currentViewController.view.frame.size];
  142. _drawvodAd.posId = @"0121212a7b45ec720e";
  143. _drawvodAd.controller = RQControllerHelper.currentViewController;
  144. _drawvodAd.delegate = self;
  145. }
  146. return _drawvodAd;
  147. }
  148. - (NSMutableArray<ADSuyiAdapterDrawvodAdView *> *)data {
  149. if(!_data) {
  150. _data = [NSMutableArray new];
  151. }
  152. return _data;
  153. }
  154. @end