重构点

播放器部分

播放器部分模块化,播放器作为一个独立的模块,

现阶段代码

- (void)buildPlayerByPlayType:(DQPlayerType)type isFirstBuild:(BOOL)isFirst {
    if (self.playerView) {
        [self.playerView stop];
        self.playerView = nil;
    }
    switch (type) {
    case DQPlayerType_default: {
        self.playerView = self.Leplayer;
    }
    break;

    case DQPlayerType_pptv: {
        self.playerView = self.pptvPlayer;
    }
    break;

    case DQPlayerType_tencent: {
        self.playerView = self.tencentPlayer;
    }
    break;

    default:
        break;
    }

    if (!isFirst) {
        [self _firstTimeSetup];
    }
    [self.contentView addSubview:self.playerView];
}

- (void)_firstTimeSetup {
    //这步是为了解决什么bug么?
    if (self->_bUserWantBack) {
        return;
    }
    
    //属于播放器初始化的属性
    self.playerView.bIsLocalFile = self.bIsLocalFile;
    
    //
    [UIApplication sharedApplication].idleTimerDisabled = YES;

    NSError *error   = nil;
    BOOL     success = [[AVAudioSession sharedInstance]
                    setCategory:AVAudioSessionCategoryPlayback
                          error:&error];
    if (!success) {
        // Handle error here, as appropriate
        //这里要加LogError
    }
    
    //这个函数才是初始化播放器的
    [self _setupPlayerRelated];
    
    //这个函数属于上报相关,不属于播放器
    [self resetReportItemsNeedAddUUID:YES];
    
    //这个函数包含了上报的参数整理、上报、UI和按钮状态、播放等
    [self _setupCurrentVideoAndPlay];

    //上报用的参数
    self->_startTime = [NSDate date];
    
    //读取播放历史
    if (self.lastPlayTime <= 0.0f) {
        [self initLastPlayTimeWithHistoryRecords];
    }
    
    //根据不同的播放状态来处理播放历史
    if (self.bVideoPlayable) {
        [self recordHistoryForIndex:self.curPlayIndex passedDuration:self.playerView.timeplayed totalDuration:self.playerView.duration];
    } else {
        [self recordHistoryForIndex:self.curPlayIndex passedDuration:self.lastPlayTime totalDuration:self.playerView.duration];
    }
    
    //监听App生命周期的一些事件,这部分也可以归于播放器模块,用接口或者block把时机暴漏给外层。
    [self _setupGlobalObservers];
}
@protocol DQOnlinePlayDataProtocol
- (NSString *)url;
- (NSString *)title;
@end

@protocol DQPlayerProtocol
//获取
- (UIViewController*)playerViewController;
- (void)refreshPlayerWithData:(id<DQOnlinePlayDataProtocol>)data;
- (void)refreshPlayerWithLiveData:(id<DQLivePlayDataProtocol>)data;
- (void)refreshPlayerWithLocalData:(id<DQLocalPlayDataProtocol>)data;

//状态获取
- (BOOL)isScreenLocked;
- (NSTimeInterval)playerInterval;
- (NSTimeInterval)duration;

//监听事件,这也可以独立出另外一个协议
- (void)playerStatusDidChanged:(DQPlayerStat)status;
.....

@end

方法命名

[self _setupCurrentVideoAndPlay];

  • 拆分函数,函数功能和函数名统一意义
  • 函数方法命名形式,-规范

上报时机化

上报的时机化(需要讨论),需要业务层支持。这里在乐搜之前执行过,由于上报点和业务点往往不是同一个点,有时需要增加很多方法跨多层传递;这里提出用通知来发消息上报,上报点只发时机,接受的上报business负责整理参数并发送给上报引擎。

- (void)LesoReportEvent_Homepage_PageView:(LesoHomePageDataModel*)model {
    LesoPadReportParams*params = [[LesoPadReportParams alloc]init];
    params.module =@"home_page";
    [[LesoPadReportEngine sharedLesoEngine]reportHomepage:params];
}

            //首页pv上报
            LesoSearchResultReportModel * model = [[LesoSearchResultReportModel alloc] init];
            model.eventType = LesoReportEvent_Homepage_PageView;
            [[NSNotificationCenter defaultCenter] postNotificationName:LESOREPORT_NOTIFICATION object:model];
            [_errorView removeFromSuperview];

同时只存在一个播放器,当需要播放其他视频时刷新播放器和详情页即可。

[self pushNewDetail:releData];

变成

 [self refresWithData:releData];
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 37.cocoa内存管理规则 1)当你使用new,alloc或copy方法创建一个对象时,该对象的保留计数器值为1...
    如风家的秘密阅读 905评论 0 4
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 174,002评论 25 709
  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 12,267评论 4 61
  • 有一个花匠,家里世世代代都是种花巧匠,在他很小的时候父亲就教他种花的方法,得天独厚的条件让他在种花方面有超强的优势...
    瑶YY阅读 334评论 0 2
  • 今天是七发成势公开课,今天感觉自己收获特别大! 从早上自己的主持,开始,我发现自己还是原来那个充满能量的妹纸!一件...
    竹清运营八阵图阅读 269评论 0 0