// // RQDspVideoDetailViewModel.m // JSJP // // Created by RONGQING on 2022/1/19. // #import "RQDspVideoDetailViewModel.h" #import #import @interface RQDspVideoDetailViewModel () @property (nonatomic, readwrite, strong) NSArray *videosItemArr; @property (nonatomic, readwrite, strong) NSIndexPath *indexPath; @property (nonatomic, readwrite, strong) ADSuyiSDKDrawvodAd *drawvodAd; @property (nonatomic, strong) NSMutableArray *data; @property (nonatomic, readwrite, strong) VideosItem *lastVideoItem; @end @implementation RQDspVideoDetailViewModel #pragma mark - Public Method - (instancetype)initWithServices:(id)services params:(NSDictionary *)params { if (self = [super initWithServices:services params:params]) { self.videosItemArr = RQ_COMMON_MANAGER.dspListArr; self.indexPath = params[RQViewCommonValueKey]; } return self; } - (void)dealloc { for (ADSuyiAdapterDrawvodAdView *adview in self.data) { // 5、广告内存回收 [adview unRegist]; } } - (void)initialize { [super initialize]; /// 允许下拉刷新 self.shouldPullDownToRefresh = YES; /// 允许上拉加载 self.shouldPullUpToLoadMore = YES; self.prefersNavigationBarHidden = YES; self.perPage = 10; @weakify(self); /// 消息列表 RAC(self, videosItemArr) = self.requestRemoteDataCommand.executionSignals.switchToLatest; /// 数据源 RAC(self, dataSource) = [RACObserve(self, videosItemArr) map:^(NSArray * videosItemArr) { @strongify(self) return [self dataSourceWithVideosItems:videosItemArr]; }]; } #pragma mark - PrivateMethod // 请求数据 - (RACSignal *)requestRemoteDataSignalWithPage:(NSUInteger)page { @weakify(self) NSArray * (^videosItemsBlock)(NSArray *) = ^(NSArray *products) { @strongify(self) [MBProgressHUD rq_hideHUD]; if (page == 1) { /// 下拉刷新 } else { /// 上拉加载 products = @[(self.videosItemArr ?: @[]).rac_sequence, products.rac_sequence].rac_sequence.flatten.array; } return products; }; return [[[self.services.client getDspListWithPageNum:page pageSize:self.perPage] map:videosItemsBlock] doError:^(NSError * _Nonnull error) { [MBProgressHUD rq_showErrorTips:error]; }]; } #pragma mark - 辅助方法 - (NSArray *)dataSourceWithVideosItems:(NSArray *)videosItemArr { if (RQObjectIsNil(videosItemArr) || videosItemArr.count == 0) return nil; NSArray *viewModels = [videosItemArr.rac_sequence map:^(VideosItem *videosItem) { RQCommonGroupViewModel *group = [RQCommonGroupViewModel groupViewModel]; videosItem.index = [videosItemArr indexOfObject:videosItem] + 1; videosItem.totalNum = videosItemArr.count; RQDspVideoDetailItemViewModel *dspVideoDetailItemViewModel = [[RQDspVideoDetailItemViewModel alloc] initWithVideosItem:videosItem]; dspVideoDetailItemViewModel.rowHeight = RQ_SCREEN_HEIGHT; dspVideoDetailItemViewModel.operation = ^{ }; group.itemViewModels = @[dspVideoDetailItemViewModel]; return group; }].array; [self loadDrawvodAd]; return viewModels ?: @[] ; } - (void)loadDrawvodAd { // 2、加载沉浸式视频广告 [self.drawvodAd load:4]; } #pragma mark - ADSuyiSDKDrawvodAdDelegate - (void)adsy_drawvodAdSuccessToLoad:(ADSuyiSDKDrawvodAd *)drawvodAd drawvodAdArray:(NSArray *)drawvodAdViewArray { for (ADSuyiAdapterDrawvodAdView *adView in drawvodAdViewArray) { // 3、渲染沉浸式广告 [adView render]; } } - (void)adsy_drawvodAdFailToLoad:(ADSuyiSDKDrawvodAd *)drawvodAd errorModel:(ADSuyiAdapterErrorDefine *)errorModel { } - (void)adsy_drawvodAdSuccessToRender:(ADSuyiSDKDrawvodAd *)drawvodAd view:(ADSuyiAdapterDrawvodAdView *)drawvodAdView { // 4、渲染成功,此时高度正常,资源加载中,可'展示 NSMutableArray *dataSourceArr = [NSMutableArray arrayWithArray:self.dataSource]; [self.data addObject:drawvodAdView]; NSInteger i = 8; if (self.lastVideoItem) { if (self.lastVideoItem.index < dataSourceArr.count) { i = self.lastVideoItem.index + arc4random() % (dataSourceArr.count - self.lastVideoItem.index) + 4; } else { return; } } else { i = (dataSourceArr.count > 6)? 6 + arc4random() % (dataSourceArr.count - 6) : 0; } if (i > dataSourceArr.count) { return; } // VideosItem *videoItem = dataSourceArr[i]; // videoItem.index = i; // videoItem.totalNum = dataSourceArr.count + 1; RQCommonGroupViewModel *group = dataSourceArr[i]; RQDspVideoDetailItemViewModel *dspVideoDetailItemViewModel = group.itemViewModels.firstObject; dspVideoDetailItemViewModel.videosItem.adView = drawvodAdView; dspVideoDetailItemViewModel.rowHeight = RQ_SCREEN_HEIGHT; dspVideoDetailItemViewModel.operation = ^{ }; group.itemViewModels = @[dspVideoDetailItemViewModel]; [dataSourceArr replaceObjectAtIndex:i withObject:group]; self.dataSource = dataSourceArr.copy; self.lastVideoItem = dspVideoDetailItemViewModel.videosItem; } - (void)adsy_drawvodAdFailToRender:(ADSuyiSDKDrawvodAd *)drawvodAd view:(ADSuyiAdapterDrawvodAdView *)drawvodAdView error:(nullable NSError *)error { } - (void)adsy_drawvodAdPlayerDidPlayFinish:(ADSuyiAdapterDrawvodAdView *)drawvodAdView { } - (void)adsy_drawvodAdDidExposure:(ADSuyiAdapterDrawvodAdView *)drawvodAdView { } - (void)adsy_drawvodAdDidClick:(ADSuyiAdapterDrawvodAdView *)drawvodAdView { } #pragma mark - LazyLoad - (ADSuyiSDKDrawvodAd *)drawvodAd { if(!_drawvodAd) { // 1、初始化沉浸式视频广告,流程和信息流广告类似 _drawvodAd = [[ADSuyiSDKDrawvodAd alloc] initWithSize:RQControllerHelper.currentViewController.view.frame.size]; _drawvodAd.posId = @"0121212a7b45ec720e"; _drawvodAd.controller = RQControllerHelper.currentViewController; _drawvodAd.delegate = self; } return _drawvodAd; } - (NSMutableArray *)data { if(!_data) { _data = [NSMutableArray new]; } return _data; } @end