From eb1ea7f479236ef20bb208812e49812b25838848 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mr=2E=E9=99=88?= Date: Fri, 4 Mar 2022 10:42:26 +0800 Subject: [PATCH 1/2] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E6=97=A0=E6=84=9F?= =?UTF-8?q?=E5=88=B7=E6=96=B0,=E6=B7=BB=E5=8A=A0=E7=BC=93=E5=AD=98?= =?UTF-8?q?=E6=8A=A5=E9=94=99=E6=8F=90=E7=A4=BA(=E5=BE=85=E5=AE=8C?= =?UTF-8?q?=E5=96=84)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Example/.DS_Store | Bin 6148 -> 8196 bytes .../xcschemes/xcschememanagement.plist | 69 ++++++++ .../xcschemes/xcschememanagement.plist | 14 ++ .../UserInterfaceState.xcuserstate | Bin 0 -> 18400 bytes .../SJVideoPlayer/Common/Model/SJVideoModel.h | 1 + .../DY/List/SJDYPlaybackListViewController.m | 166 +++++++++++++++--- .../Demos/DY/List/SJDYTableViewCell.h | 1 + .../Demos/DY/List/SJDYTableViewCell.m | 2 +- 8 files changed, 226 insertions(+), 27 deletions(-) create mode 100644 Example/Pods/Pods.xcodeproj/xcuserdata/chenzhengzheng.xcuserdatad/xcschemes/xcschememanagement.plist create mode 100644 Example/SJVideoPlayer.xcodeproj/xcuserdata/chenzhengzheng.xcuserdatad/xcschemes/xcschememanagement.plist create mode 100644 Example/SJVideoPlayer.xcworkspace/xcuserdata/chenzhengzheng.xcuserdatad/UserInterfaceState.xcuserstate diff --git a/Example/.DS_Store b/Example/.DS_Store index a0299b08b1961999f56291732465ea199d44715f..6bacc43a6c5a7e354470483f63afc881e3f0996c 100644 GIT binary patch delta 676 zcmZoMXmOBWU|?W$DortDU;r^WfEYvza8FDWo2aKKDg%-S@);O18FCm>J#+GtlX5l- za)_~PEa+uk%+A3vv4Eu>q>7y(fFYkDg&_@DWquOKFd%jWV!i)h0Aw*R@Sv(@&;y#D z&ydWJ4Y2{PZ#|km7O1{rWOYCb7-f+aPUc}*Cxfg4sGu7~fgY<|eNuUGK~fIbsuM{C zIhn;J1_sv|nV4Bv*?|7y;^5-tiVe=lFApwBEGaE^N-T;7@d6S{GLoR|ko^1{I6E;Z zEHkw{UO>b-Kd&S)GcUCWtT{6!6{sX8JTosPzuYOmG%uwXY))_}M23TdlY=u}K)kxz z%tS}Q(9)z6A-A%sx~8^n2GAEkzzB>JFyM#MFly#x zpwA}nV)=*e{hvS;@Cca9$7Zy72dfApnkuGr6jgWF%qE{>M0|%s>r5AixbITtNnHEd0(qnP0{eWGn*{ P#0rqD44dP5<}d>Qz&;s$ diff --git a/Example/Pods/Pods.xcodeproj/xcuserdata/chenzhengzheng.xcuserdatad/xcschemes/xcschememanagement.plist b/Example/Pods/Pods.xcodeproj/xcuserdata/chenzhengzheng.xcuserdatad/xcschemes/xcschememanagement.plist new file mode 100644 index 000000000..d32c1baf4 --- /dev/null +++ b/Example/Pods/Pods.xcodeproj/xcuserdata/chenzhengzheng.xcuserdatad/xcschemes/xcschememanagement.plist @@ -0,0 +1,69 @@ + + + + + SchemeUserState + + CocoaAsyncSocket.xcscheme_^#shared#^_ + + orderHint + 5 + + MJRefresh.xcscheme_^#shared#^_ + + orderHint + 6 + + Masonry.xcscheme_^#shared#^_ + + orderHint + 12 + + Pods-SJVideoPlayer_Example.xcscheme_^#shared#^_ + + orderHint + 4 + + SDWebImage.xcscheme_^#shared#^_ + + orderHint + 3 + + SJBaseVideoPlayer.xcscheme_^#shared#^_ + + orderHint + 11 + + SJFullscreenPopGesture.xcscheme_^#shared#^_ + + orderHint + 9 + + SJMediaCacheServer.xcscheme_^#shared#^_ + + orderHint + 8 + + SJRouter.xcscheme_^#shared#^_ + + orderHint + 2 + + SJUIKit.xcscheme_^#shared#^_ + + orderHint + 1 + + SJVideoPlayer.xcscheme_^#shared#^_ + + orderHint + 10 + + YYModel.xcscheme_^#shared#^_ + + orderHint + 7 + + + + diff --git a/Example/SJVideoPlayer.xcodeproj/xcuserdata/chenzhengzheng.xcuserdatad/xcschemes/xcschememanagement.plist b/Example/SJVideoPlayer.xcodeproj/xcuserdata/chenzhengzheng.xcuserdatad/xcschemes/xcschememanagement.plist new file mode 100644 index 000000000..8a3192747 --- /dev/null +++ b/Example/SJVideoPlayer.xcodeproj/xcuserdata/chenzhengzheng.xcuserdatad/xcschemes/xcschememanagement.plist @@ -0,0 +1,14 @@ + + + + + SchemeUserState + + SJVideoPlayer-Example.xcscheme_^#shared#^_ + + orderHint + 0 + + + + diff --git a/Example/SJVideoPlayer.xcworkspace/xcuserdata/chenzhengzheng.xcuserdatad/UserInterfaceState.xcuserstate b/Example/SJVideoPlayer.xcworkspace/xcuserdata/chenzhengzheng.xcuserdatad/UserInterfaceState.xcuserstate new file mode 100644 index 0000000000000000000000000000000000000000..b3babeaa9d2fc2d9647944ac9cc233ce56ee85a7 GIT binary patch literal 18400 zcmeHud3aM*xA)%XoIq&{Buz-Ckfv#pHffV4O`5c{1v)~3mZ1ZbDWq*m18q~26ex)9 z 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 Ub #import -@interface SJDYPlaybackListViewController () +@interface SJDYPlaybackListViewController () @property (nonatomic, strong) UITableView *tableView; @property (nonatomic, strong) SJDYDataProvider *dataProvider; @property (nonatomic, strong) NSMutableArray *list; @property (nonatomic, strong) id curPlayer; - @property (nonatomic, strong, nullable) id prePrefetchTask; @property (nonatomic, strong, nullable) id nextPrefetchTask; +@property (nonatomic ,strong) NSMutableArray *prefetchTaskArray; +@property (nonatomic ,assign) BOOL isLoadingData; //是否加载正在数据中 +@property (nonatomic ,assign) BOOL isCacheData; //是否有缓存数据 @end @implementation SJDYPlaybackListViewController @@ -63,7 +65,9 @@ - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger } - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { - return [SJDYTableViewCell cellWithTableView:tableView indexPath:indexPath]; + SJDYTableViewCell *cell=[SJDYTableViewCell cellWithTableView:tableView indexPath:indexPath]; + cell.indexPath = indexPath; + return cell; } - (void)tableView:(UITableView *)tableView willDisplayCell:(SJDYTableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath { @@ -78,10 +82,15 @@ - (void)tableView:(UITableView *)tableView willDisplayCell:(SJDYTableViewCell *) if ( _curPlayer == nil ) { _curPlayer = cell.player; } - [_prePrefetchTask cancel]; - [_nextPrefetchTask cancel]; - _prePrefetchTask = [self _prefetchTaskWithIndex:indexPath.row - 1]; - _nextPrefetchTask = [self _prefetchTaskWithIndex:indexPath.row + 1]; + if (self.list.count - indexPath.row <= 3 && + !self.isLoadingData) { + self.isLoadingData = YES; + [self loadDataWithShowLoading:NO]; + } +// [_prePrefetchTask cancel]; +// [_nextPrefetchTask cancel]; +// _prePrefetchTask = [self _prefetchTaskWithIndex:indexPath.row - 1]; +// _nextPrefetchTask = [self _prefetchTaskWithIndex:indexPath.row + 1]; } - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { @@ -116,17 +125,24 @@ - (void)_checkVisibleCells { max = intersection; } } - + if ( target == nil ) return; + SJVideoModel *model = _list[target.indexPath.row]; + + if (model.error) { + [self showToastAlert]; + } + id cur = target.player; + if ( cur != _curPlayer ) { [_curPlayer pause]; } - + _curPlayer = cur; - + if ( !_curPlayer.isUserPaused ) { [_curPlayer play]; } @@ -153,19 +169,31 @@ - (void)_setupTableView { make.edges.offset(0); }]; + [SJDYTableViewCell registerWithTableView:_tableView]; - // 请求列表数据 + [self loadDataWithShowLoading:YES]; + + [_tableView sj_exeHeaderRefreshingAnimated:NO]; // 执行头部刷新 +} +#pragma Mark 本次修改主要为这里,在请求刷新处做无感处理(缓存处理为疯狂模式···)。 +- (void)loadDataWithShowLoading:(BOOL)isShowLoading{ + //当有缓存未加载时,直接展示缓存数据 + if (self.isCacheData) { + [self refreshView]; + return; + } // 模拟请求网络数据 __weak typeof(self) _self = self; - [_tableView sj_setupRefreshingWithPageSize:20 beginPageNum:1 refreshingBlock:^(__kindof UIScrollView * _Nonnull scrollView, NSInteger requestPageNum) { - __strong typeof(_self) self = _self; - if ( !self ) return; - + //提前获取数据时,无须显示loading状态,直接请求数据。 + if (!isShowLoading) { // 模拟延迟 dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ [self.dataProvider playbackListWithPageNum:self.tableView.sj_pageNum pageSize:self.tableView.sj_pageSize completionHandler:^(NSArray * _Nullable list, NSError * _Nullable error) { __strong typeof(_self) self = _self; + + self.isLoadingData = NO; + if ( !self ) return; if ( error ) { // error @@ -178,24 +206,64 @@ - (void)_setupTableView { [self.curPlayer stop]; self.curPlayer = nil; [self.list removeAllObjects]; + [self.prefetchTaskArray removeAllObjects]; } // 添加到播放列表中, 刷新列表 [self.list addObjectsFromArray:list]; - [self.tableView reloadData]; - [self.tableView sj_endRefreshingWithItemCount:list.count]; - [self _checkVisibleCells]; + NSIndexPath *idxP = [self.tableView indexPathsForVisibleRows].lastObject; + + for (int i = 0; i < idxP.row; i++) { + id task = self.prefetchTaskArray[i]; + [task cancel]; + } + + if (idxP && + self.tableView.sj_pageNum != self.tableView.sj_beginPageNum) + [self.prefetchTaskArray removeObjectsInRange:NSMakeRange(0, idxP.row - 1)]; + else + [self.prefetchTaskArray removeAllObjects]; + + for (int i = 0; i < self.list.count; i++) { + [self.prefetchTaskArray addObject:[self _prefetchTaskWithIndex:i]]; + } + + //如果当前是最后一个,或者下拉刷新,直接刷新页面 + if (self.tableView.sj_pageNum == 1) { + [self refreshView]; + }else if (idxP && (self.list.count - 1 == idxP.row)) { + [self refreshView]; + [self.tableView setContentOffset:CGPointMake(self.tableView.contentOffset.x, self.tableView.contentOffset.y + self.tableView.frame.size.height)]; + }else{ + //否则缓存数据,待用户上拉是自动刷新并滑动到下一个视频,同时做到无感刷新 + self.isCacheData = YES; + } }]; }); - }]; - - [_tableView sj_exeHeaderRefreshingAnimated:NO]; // 执行头部刷新 + }else{ + //只展示loading状态,只有下拉刷新时主动获取数据 + [_tableView sj_setupRefreshingWithPageSize:10 beginPageNum:1 refreshingBlock:^(__kindof UIScrollView * _Nonnull scrollView, NSInteger requestPageNum) { + __strong typeof(_self) self = _self; + if ( !self ) return; + + if (requestPageNum == 1 || + !self.isLoadingData) { + [self loadDataWithShowLoading:NO]; + } + }]; + } +} +- (void)refreshView{ + self.isCacheData = NO; + [self.tableView reloadData]; + [self.tableView sj_endRefreshingWithItemCount:self.list.count]; + [self _checkVisibleCells]; } - // 配置边播边缓存模块 - (void)_setupMediaCacheServer { // 开启控制台log - SJMediaCacheServer.shared.enabledConsoleLog = YES; + SJMediaCacheServer.shared.enabledConsoleLog = NO; + SJMediaCacheServer.shared.maxConcurrentPrefetchCount = 10; SJMediaCacheServer.shared.resolveAssetIdentifier = ^NSString * _Nonnull(NSURL * _Nonnull URL) { // 由于demo中同一个视频的URL后面的参数不一样, 为保证引用相同的缓存文件, 这里删除了URL后面的所有参数 // 例如: @@ -206,12 +274,58 @@ - (void)_setupMediaCacheServer { }; } -#pragma mark - +#pragma mark - 此处修改为请求数据回来直接批量缓存,因为现在改为无感刷新,所以每次可以请求少量数据进行缓存,并且添加了报错处理,但还需要改进 -// 预加载指定位置的某个资源`1M`的内容 +// 预加载指定位置的某个资源`1M`的内容 缓存失败回调处理。 - (nullable id)_prefetchTaskWithIndex:(NSInteger)index { if ( index < 0 || index >= _list.count ) return nil; - return [SJMediaCacheServer.shared prefetchWithURL:_list[index].URL preloadSize:1 * 1024 * 1024]; + +// id prefetch__Task = [SJMediaCacheServer.shared prefetchWithURL:_list[index].URL preloadSize:1 * 1024 * 1024]; + SJVideoModel *model = _list[index]; + id prefetch__Task = [SJMediaCacheServer.shared prefetchWithURL:model.URL preloadSize:1 * 1024 * 1024 progress:^(float progress) { + + } completed:^(NSError * _Nullable error) { + if (error) { + model.error = error; + NSArray *array = [self.tableView visibleCells]; + NSInteger indexRow = -1; + if (array.count > 0) { + SJDYTableViewCell *cell = array.firstObject; + indexRow = cell.indexPath.row; + } + if (indexRow == index) { + [self showToastAlert]; + } + } + }]; + return prefetch__Task; +} +#pragma mark 报错提示,希望视频界面内部有调用方法 +- (void)showToastAlert{ + UILabel *lab = [[UILabel alloc]init]; + [self.view addSubview:lab]; + lab.textColor = UIColor.whiteColor; + lab.alpha = 0.9; + lab.textAlignment = NSTextAlignmentCenter; + lab.backgroundColor = [UIColor.blackColor colorWithAlphaComponent:0.4]; + lab.text = @"视频加载失败"; + [lab mas_makeConstraints:^(MASConstraintMaker *make) { + make.centerY.mas_equalTo(self.view.mas_centerY); + make.left.right.mas_equalTo(self.view); + make.height.mas_equalTo(40); + }]; + [UIView animateWithDuration:2 animations:^{ + lab.alpha = 1; + } completion:^(BOOL finished) { + [lab removeFromSuperview]; + }]; +} +#pragma mark 提前缓存数据对象 +- (NSMutableArray *)prefetchTaskArray{ + if (!_prefetchTaskArray) { + _prefetchTaskArray = [NSMutableArray arrayWithCapacity:0]; + } + return _prefetchTaskArray; } @end diff --git a/Example/SJVideoPlayer/Demos/DY/List/SJDYTableViewCell.h b/Example/SJVideoPlayer/Demos/DY/List/SJDYTableViewCell.h index dde3abab4..3a25ed68f 100644 --- a/Example/SJVideoPlayer/Demos/DY/List/SJDYTableViewCell.h +++ b/Example/SJVideoPlayer/Demos/DY/List/SJDYTableViewCell.h @@ -12,6 +12,7 @@ NS_ASSUME_NONNULL_BEGIN @interface SJDYTableViewCell : SJBaseTableViewCell @property (nonatomic, strong, readonly) id player; +@property (nonatomic) NSIndexPath *indexPath; @end @protocol SJDYDemoPlayer diff --git a/Example/SJVideoPlayer/Demos/DY/List/SJDYTableViewCell.m b/Example/SJVideoPlayer/Demos/DY/List/SJDYTableViewCell.m index d95e092f1..e81775ea4 100644 --- a/Example/SJVideoPlayer/Demos/DY/List/SJDYTableViewCell.m +++ b/Example/SJVideoPlayer/Demos/DY/List/SJDYTableViewCell.m @@ -97,7 +97,7 @@ - (instancetype)init { if ( self ) { self.view.backgroundColor = UIColor.clearColor; self.presentView.backgroundColor = UIColor.clearColor; - self.videoGravity = AVLayerVideoGravityResizeAspectFill; + self.videoGravity = AVLayerVideoGravityResizeAspect; self.autoplayWhenSetNewAsset = NO; self.rotationManager.disabledAutorotation = YES; self.pauseWhenAppDidEnterBackground = YES; From f63e8b784c910dcb03e1408abde5afd19342c88a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=88=E5=BE=81?= Date: Thu, 3 Nov 2022 15:31:41 +0800 Subject: [PATCH 2/2] =?UTF-8?q?=E4=BF=AE=E6=94=B9DY=E6=97=A0=E6=84=9F?= =?UTF-8?q?=E5=88=B7=E6=96=B0bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .DS_Store | Bin 6148 -> 6148 bytes .../xcschemes/xcschememanagement.plist | 69 ++++++ .../xcschemes/xcschememanagement.plist | 14 ++ .../UserInterfaceState.xcuserstate | Bin 0 -> 15299 bytes .../DY/List/SJDYPlaybackListViewController.m | 203 +++++++----------- 5 files changed, 165 insertions(+), 121 deletions(-) create mode 100644 Example/Pods/Pods.xcodeproj/xcuserdata/mac.xcuserdatad/xcschemes/xcschememanagement.plist create mode 100644 Example/SJVideoPlayer.xcodeproj/xcuserdata/mac.xcuserdatad/xcschemes/xcschememanagement.plist create mode 100644 Example/SJVideoPlayer.xcworkspace/xcuserdata/mac.xcuserdatad/UserInterfaceState.xcuserstate diff --git a/.DS_Store b/.DS_Store index f4aa91cd2f346cf9f09181d8e22ebecdaa659839..c518eaa97c4c95fb744c337ce86ddd0cca2994d7 100644 GIT binary patch delta 486 zcmZoMXfc@JFUrBdz`)4BAi%&-%%I0m!H~?5&yccNkYhP>JxGe5A)X-sB!n!@kjhZN zPy`gs^32IkPRhwo0;&X>z_1>O_5Onakj22j&fp3(GLaz{s6K}w6-~7xe$~23<;4Y1 z!*?bX%gMnRFCbZ6ZDMGu zqhM%cQmdm-ZD?$2tfOFNVp?0v$sww&Zygk$os*lF-wk#l10&G$V89EdVN}oL*{q7m zTns)8o(#@FfA}#314%ugUs6#0!6*yVg6wNfh9ICyM+O%LUmQ9>cEfc{wquu5Kr`|u ovH~Dmbn*r^DJ`Jw1<<%C0LDQwswSp%gr<#!n;18Wab6n@hhItdDd3W+Xf0lNsrq)oFyG9g{Ss;W_00BUR;C6*kIl{gJ01bM+F zK-_>6uwsEg>Iv9z2F}2nAE0qcRI!K(nkUVCZ)V<`$$X#f$p8RpjshE?3;-01K&yz= zDJI56nX?t$Q$i$Sjzf14M?CJT_FTN_Fbo(5&KCpX-L>ErbRmQ^_x`TI4m<}B`j9{b z9e+Gb{D}LQaqK5iI83Y6uViJ_x^Qug(jqOEicj4hAG@iSj)qNd@L05Vy|m|R{~_nm zFW>X`!_N4ieC-~OQ!k7=1DPBK9SnK$D2xL>Zt_ta4COqo8lbd53kT(m$)wh3RM_o$ zby{JQ?d@uXZPx13X@Oq9Y2Ufu?jOCFyqvyzqu3_+d6ITT<4<^tPHvk~*LI)rej-C& zf4Dmz(dVs}CW3yffBUk&{^``H;0#eo@5E~F<)XRYlM|%`EH)|DU+gn1Q##a6B1zND>8L{ZzcNA+u^hx2~-S~WXRSCB+E25WY`lX%oM70Ao}t_^vXovP>5U|=Vvk;h@;Tdh5^ICECZ{m zSr+I2&Y$o9vq`397%&X{R}2uV<+hr*C4IKeZBCrE3`-k}FcFt2lqp#0<5)W4DBi## a4ab;p5FL$~LhL~^e*`2ArZNmHm4P2E?dm50 diff --git a/Example/Pods/Pods.xcodeproj/xcuserdata/mac.xcuserdatad/xcschemes/xcschememanagement.plist b/Example/Pods/Pods.xcodeproj/xcuserdata/mac.xcuserdatad/xcschemes/xcschememanagement.plist new file mode 100644 index 000000000..576d1a48e --- /dev/null +++ b/Example/Pods/Pods.xcodeproj/xcuserdata/mac.xcuserdatad/xcschemes/xcschememanagement.plist @@ -0,0 +1,69 @@ + + + + + SchemeUserState + + CocoaAsyncSocket.xcscheme_^#shared#^_ + + orderHint + 6 + + MJRefresh.xcscheme_^#shared#^_ + + orderHint + 3 + + Masonry.xcscheme_^#shared#^_ + + orderHint + 2 + + Pods-SJVideoPlayer_Example.xcscheme_^#shared#^_ + + orderHint + 5 + + SDWebImage.xcscheme_^#shared#^_ + + orderHint + 4 + + SJBaseVideoPlayer.xcscheme_^#shared#^_ + + orderHint + 7 + + SJFullscreenPopGesture.xcscheme_^#shared#^_ + + orderHint + 10 + + SJMediaCacheServer.xcscheme_^#shared#^_ + + orderHint + 11 + + SJRouter.xcscheme_^#shared#^_ + + orderHint + 12 + + SJUIKit.xcscheme_^#shared#^_ + + orderHint + 1 + + SJVideoPlayer.xcscheme_^#shared#^_ + + orderHint + 9 + + YYModel.xcscheme_^#shared#^_ + + orderHint + 8 + + + + diff --git a/Example/SJVideoPlayer.xcodeproj/xcuserdata/mac.xcuserdatad/xcschemes/xcschememanagement.plist b/Example/SJVideoPlayer.xcodeproj/xcuserdata/mac.xcuserdatad/xcschemes/xcschememanagement.plist new file mode 100644 index 000000000..8a3192747 --- /dev/null +++ b/Example/SJVideoPlayer.xcodeproj/xcuserdata/mac.xcuserdatad/xcschemes/xcschememanagement.plist @@ -0,0 +1,14 @@ + + + + + SchemeUserState + + SJVideoPlayer-Example.xcscheme_^#shared#^_ + + orderHint + 0 + + + + diff --git a/Example/SJVideoPlayer.xcworkspace/xcuserdata/mac.xcuserdatad/UserInterfaceState.xcuserstate b/Example/SJVideoPlayer.xcworkspace/xcuserdata/mac.xcuserdatad/UserInterfaceState.xcuserstate new file mode 100644 index 0000000000000000000000000000000000000000..e8e97c6ccd4d5fba11834369e73efe9a2c0e41dd GIT binary patch literal 15299 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 literal 0 HcmV?d00001 diff --git a/Example/SJVideoPlayer/Demos/DY/List/SJDYPlaybackListViewController.m b/Example/SJVideoPlayer/Demos/DY/List/SJDYPlaybackListViewController.m index 99e7512ca..3c1e6fe11 100644 --- a/Example/SJVideoPlayer/Demos/DY/List/SJDYPlaybackListViewController.m +++ b/Example/SJVideoPlayer/Demos/DY/List/SJDYPlaybackListViewController.m @@ -19,16 +19,18 @@ #import #import -@interface SJDYPlaybackListViewController () +@interface SJDYPlaybackListViewController () @property (nonatomic, strong) UITableView *tableView; @property (nonatomic, strong) SJDYDataProvider *dataProvider; @property (nonatomic, strong) NSMutableArray *list; @property (nonatomic, strong) id curPlayer; + @property (nonatomic, strong, nullable) id prePrefetchTask; @property (nonatomic, strong, nullable) id nextPrefetchTask; -@property (nonatomic ,strong) NSMutableArray *prefetchTaskArray; + @property (nonatomic ,assign) BOOL isLoadingData; //是否加载正在数据中 @property (nonatomic ,assign) BOOL isCacheData; //是否有缓存数据 + @end @implementation SJDYPlaybackListViewController @@ -65,9 +67,7 @@ - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger } - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { - SJDYTableViewCell *cell=[SJDYTableViewCell cellWithTableView:tableView indexPath:indexPath]; - cell.indexPath = indexPath; - return cell; + return [SJDYTableViewCell cellWithTableView:tableView indexPath:indexPath]; } - (void)tableView:(UITableView *)tableView willDisplayCell:(SJDYTableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath { @@ -82,15 +82,16 @@ - (void)tableView:(UITableView *)tableView willDisplayCell:(SJDYTableViewCell *) if ( _curPlayer == nil ) { _curPlayer = cell.player; } + //提前请求数据 if (self.list.count - indexPath.row <= 3 && !self.isLoadingData) { self.isLoadingData = YES; [self loadDataWithShowLoading:NO]; } -// [_prePrefetchTask cancel]; -// [_nextPrefetchTask cancel]; -// _prePrefetchTask = [self _prefetchTaskWithIndex:indexPath.row - 1]; -// _nextPrefetchTask = [self _prefetchTaskWithIndex:indexPath.row + 1]; + [_prePrefetchTask cancel]; + [_nextPrefetchTask cancel]; + _prePrefetchTask = [self _prefetchTaskWithIndex:indexPath.row - 1]; + _nextPrefetchTask = [self _prefetchTaskWithIndex:indexPath.row + 1]; } - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { @@ -129,14 +130,7 @@ - (void)_checkVisibleCells { if ( target == nil ) return; - SJVideoModel *model = _list[target.indexPath.row]; - - if (model.error) { - [self showToastAlert]; - } - id cur = target.player; - if ( cur != _curPlayer ) { [_curPlayer pause]; } @@ -169,80 +163,93 @@ - (void)_setupTableView { make.edges.offset(0); }]; - [SJDYTableViewCell registerWithTableView:_tableView]; - - [self loadDataWithShowLoading:YES]; - + [self loadDataWithShowLoading:YES];//首次请求数据 [_tableView sj_exeHeaderRefreshingAnimated:NO]; // 执行头部刷新 } -#pragma Mark 本次修改主要为这里,在请求刷新处做无感处理(缓存处理为疯狂模式···)。 +#pragma Mark 本次修改主要为这里,在请求刷新处做无感处理 - (void)loadDataWithShowLoading:(BOOL)isShowLoading{ //当有缓存未加载时,直接展示缓存数据 if (self.isCacheData) { [self refreshView]; return; } - // 模拟请求网络数据 + // 模拟请求网络数据 __weak typeof(self) _self = self; - //提前获取数据时,无须显示loading状态,直接请求数据。 + // 提前获取数据时,无须显示loading状态,直接请求数据。 if (!isShowLoading) { // 模拟延迟 - dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ - [self.dataProvider playbackListWithPageNum:self.tableView.sj_pageNum pageSize:self.tableView.sj_pageSize completionHandler:^(NSArray * _Nullable list, NSError * _Nullable error) { - __strong typeof(_self) self = _self; - - self.isLoadingData = NO; - - if ( !self ) return; - if ( error ) { - // error - NSLog(@"%@", error); - return; - } - // 如果是请求首页的数据, 即下拉 - if ( self.tableView.sj_pageNum == self.tableView.sj_beginPageNum ) { - // 下拉刷新时, 清理播放数据 - [self.curPlayer stop]; - self.curPlayer = nil; - [self.list removeAllObjects]; - [self.prefetchTaskArray removeAllObjects]; - } + [self.dataProvider playbackListWithPageNum:self.tableView.sj_pageNum pageSize:self.tableView.sj_pageSize completionHandler:^(NSArray * _Nullable list, NSError * _Nullable error) { + + __strong typeof(_self) self = _self; + + if ( !self ) return; + + self.isLoadingData = NO; + + if ( error ) { + // error + [self.tableView sj_endRefreshing]; + NSLog(@"%@", error); + return; + } + + if (list.count == 0){ + [self.tableView sj_endRefreshing]; + [self.tableView sj_endRefreshingWithItemCount:0]; + return; + } + + // 如果是请求首页的数据, 即下拉 + if ( self.tableView.sj_pageNum == self.tableView.sj_beginPageNum ) { + // 下拉刷新时, 清理播放数据 + [self.curPlayer stop]; + self.curPlayer = nil; + [self.list removeAllObjects]; - // 添加到播放列表中, 刷新列表 + } + + NSIndexPath *idxP = [self.tableView indexPathsForVisibleRows].lastObject; + //如果当前是最后一个,或者下拉刷新,直接刷新页面 + if (self.tableView.sj_pageNum == 1) { [self.list addObjectsFromArray:list]; - NSIndexPath *idxP = [self.tableView indexPathsForVisibleRows].lastObject; - - for (int i = 0; i < idxP.row; i++) { - id task = self.prefetchTaskArray[i]; - [task cancel]; - } - - if (idxP && - self.tableView.sj_pageNum != self.tableView.sj_beginPageNum) - [self.prefetchTaskArray removeObjectsInRange:NSMakeRange(0, idxP.row - 1)]; - else - [self.prefetchTaskArray removeAllObjects]; + [self refreshView]; + }else if (idxP && + (self.list.count - 1 == idxP.row) && + self.tableView.sj_footerRefreshState == SJWrapRefreshStateRefreshing + ) { - for (int i = 0; i < self.list.count; i++) { - [self.prefetchTaskArray addObject:[self _prefetchTaskWithIndex:i]]; - } + [self.list addObjectsFromArray:list]; + self.isCacheData = NO; + [self.tableView sj_endRefreshingWithItemCount:self.list.count]; + [self.tableView reloadData]; - //如果当前是最后一个,或者下拉刷新,直接刷新页面 - if (self.tableView.sj_pageNum == 1) { - [self refreshView]; - }else if (idxP && (self.list.count - 1 == idxP.row)) { - [self refreshView]; - [self.tableView setContentOffset:CGPointMake(self.tableView.contentOffset.x, self.tableView.contentOffset.y + self.tableView.frame.size.height)]; - }else{ - //否则缓存数据,待用户上拉是自动刷新并滑动到下一个视频,同时做到无感刷新 - self.isCacheData = YES; - } - }]; - }); + dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.1 * NSEC_PER_SEC)), dispatch_get_global_queue(0, 0), ^{ + + dispatch_sync(dispatch_get_main_queue(), ^{ + __strong typeof(self) strongSelf = _self; + [strongSelf.tableView setContentOffset:CGPointMake(strongSelf.tableView.contentOffset.x, strongSelf.tableView.contentOffset.y + strongSelf.tableView.frame.size.height) animated:YES]; + }); + + dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.2 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ + __strong typeof(self) strongSelf = _self; + [strongSelf _checkVisibleCells]; + }); + + }); +// 无数据判断 +// if (self.list.count == totalElements){ +// [self.tableView sj_endRefreshingWithItemCount:0]; +// } + }else{ + [self.list addObjectsFromArray:list]; + self.isCacheData = YES; + } + }]; + }else{ - //只展示loading状态,只有下拉刷新时主动获取数据 - [_tableView sj_setupRefreshingWithPageSize:10 beginPageNum:1 refreshingBlock:^(__kindof UIScrollView * _Nonnull scrollView, NSInteger requestPageNum) { + //只展示loading状态,只有下拉刷新时主动获取数据 size 控制每次请求数据多少 + [_tableView sj_setupRefreshingWithPageSize:5 beginPageNum:1 refreshingBlock:^(__kindof UIScrollView * _Nonnull scrollView, NSInteger requestPageNum) { __strong typeof(_self) self = _self; if ( !self ) return; @@ -263,7 +270,6 @@ - (void)refreshView{ - (void)_setupMediaCacheServer { // 开启控制台log SJMediaCacheServer.shared.enabledConsoleLog = NO; - SJMediaCacheServer.shared.maxConcurrentPrefetchCount = 10; SJMediaCacheServer.shared.resolveAssetIdentifier = ^NSString * _Nonnull(NSURL * _Nonnull URL) { // 由于demo中同一个视频的URL后面的参数不一样, 为保证引用相同的缓存文件, 这里删除了URL后面的所有参数 // 例如: @@ -280,52 +286,7 @@ - (void)_setupMediaCacheServer { - (nullable id)_prefetchTaskWithIndex:(NSInteger)index { if ( index < 0 || index >= _list.count ) return nil; - -// id prefetch__Task = [SJMediaCacheServer.shared prefetchWithURL:_list[index].URL preloadSize:1 * 1024 * 1024]; - SJVideoModel *model = _list[index]; - id prefetch__Task = [SJMediaCacheServer.shared prefetchWithURL:model.URL preloadSize:1 * 1024 * 1024 progress:^(float progress) { - - } completed:^(NSError * _Nullable error) { - if (error) { - model.error = error; - NSArray *array = [self.tableView visibleCells]; - NSInteger indexRow = -1; - if (array.count > 0) { - SJDYTableViewCell *cell = array.firstObject; - indexRow = cell.indexPath.row; - } - if (indexRow == index) { - [self showToastAlert]; - } - } - }]; - return prefetch__Task; -} -#pragma mark 报错提示,希望视频界面内部有调用方法 -- (void)showToastAlert{ - UILabel *lab = [[UILabel alloc]init]; - [self.view addSubview:lab]; - lab.textColor = UIColor.whiteColor; - lab.alpha = 0.9; - lab.textAlignment = NSTextAlignmentCenter; - lab.backgroundColor = [UIColor.blackColor colorWithAlphaComponent:0.4]; - lab.text = @"视频加载失败"; - [lab mas_makeConstraints:^(MASConstraintMaker *make) { - make.centerY.mas_equalTo(self.view.mas_centerY); - make.left.right.mas_equalTo(self.view); - make.height.mas_equalTo(40); - }]; - [UIView animateWithDuration:2 animations:^{ - lab.alpha = 1; - } completion:^(BOOL finished) { - [lab removeFromSuperview]; - }]; -} -#pragma mark 提前缓存数据对象 -- (NSMutableArray *)prefetchTaskArray{ - if (!_prefetchTaskArray) { - _prefetchTaskArray = [NSMutableArray arrayWithCapacity:0]; - } - return _prefetchTaskArray; + return [SJMediaCacheServer.shared prefetchWithURL:_list[index].URL preloadSize:1 * 1024 * 1024]; } + @end