代码迭代提议

引文

由于之前开发时间仓促,需求混乱、不明确 ,及公司内部、组内成员等多方面因素影响,我们的代码虽然满足了各方面的需求,实现了强大的功能;但代码本身还有较大优化的空间。为方便以后代码的迭代,和提高代码本身的质量 ,及提高 SDK 本身执行效率和性能,参考多方面资料,特提出此提议。

核心目标

  • MGPlayerController 重新定义
  • 代码规范约定
  • 性能优化
  • 代码优化

MGPlayerController 重新定义

原因

之前的 MGPlayerController 定义混乱 ,层次不够清晰,不仅会造成上层使用不方便 ,还会导致代码迭代困难。

建议

向 iOS 自带 MPMoviePlayerController 类靠近 ,重新定义 MGPlayerController 类 ;并在此基础上定义出更符合我们本身需求的类。主要涉及到以下几个方面:

  1. 分类规则
  2. 类扩展
  3. 协议使用
  4. 类继承
摘录 MPMoviePlayerController 类


#import <Foundation/Foundation.h>
#import <MediaPlayer/MediaPlayerDefines.h>
#import <MediaPlayer/MPMediaPlayback.h>
#import <UIKit/UIKit.h>

@class MPMovieAccessLog, MPMovieErrorLog;

// -----------------------------------------------------------------------------
// Types

typedef NS_ENUM(NSInteger, MPMovieScalingMode) {
 
typedef NS_ENUM(NSInteger, MPMoviePlaybackState) {
  
typedef NS_OPTIONS(NSUInteger, MPMovieLoadState) {

typedef NS_ENUM(NSInteger, MPMovieRepeatMode) {
 
typedef NS_ENUM(NSInteger, MPMovieControlStyle) {
 
typedef NS_ENUM(NSInteger, MPMovieFinishReason) {
  

// -----------------------------------------------------------------------------
// Movie Property Types

typedef NS_OPTIONS(NSUInteger, MPMovieMediaTypeMask) {
 
typedef NS_ENUM(NSInteger, MPMovieSourceType) {
  
// -----------------------------------------------------------------------------
// Movie Player
// 
// See MPMediaPlayback.h for the playback methods.

MP_API_IOS_DEPRECATED_WITH_REPLACEMENT_MACOS_TVOS_PROHIBITED("Use AVPlayerViewController in AVKit.", 2.0, 9.0, 10.12.2, 10.12.2, 2.0, 9.0)
@interface MPMoviePlayerController : NSObject <MPMediaPlayback>

- (instancetype)initWithContentURL:(NSURL *)url NS_DESIGNATED_INITIALIZER;

@property (nonatomic, copy) NSURL *contentURL;

// The view in which the media and playback controls are displayed.
@property (nonatomic, readonly) UIView *view;


@end

// -----------------------------------------------------------------------------
// Movie properties of the current movie prepared for playback.

@interface MPMoviePlayerController (MPMovieProperties)

@end

// -----------------------------------------------------------------------------
// Movie Player Notifications

// Posted when the scaling mode changes.
MP_EXTERN NSString * const MPMoviePlayerScalingModeDidChangeNotification MP_API_IOS_DEPRECATED_MACOS_TVOS_PROHIBITED(2.0, 9.0, 10.12.2, 10.12.2, 2.0, 9.0);


// -----------------------------------------------------------------------------
// Movie Property Notifications

// Calling -prepareToPlay on the movie player will begin determining movie properties asynchronously.
// These notifications are posted when the associated movie property becomes available.
MP_EXTERN NSString * const MPMovieMediaTypesAvailableNotification MP_API_IOS_DEPRECATED_MACOS_TVOS_PROHIBITED(3.2, 9.0, 10.12.2, 10.12.2, 3.2, 9.0);

// -----------------------------------------------------------------------------
// Thumbnails

typedef NS_ENUM(NSInteger, MPMovieTimeOption) {
    MPMovieTimeOptionNearestKeyFrame,
    MPMovieTimeOptionExact
} MP_API_IOS_DEPRECATED_MACOS_TVOS_PROHIBITED(3.2, 9.0, 10.12.2, 10.12.2, 3.2, 9.0);

@interface MPMoviePlayerController (MPMoviePlayerThumbnailGeneration)

@end

// Posted when each thumbnail image request is completed.
MP_EXTERN NSString * const MPMoviePlayerThumbnailImageRequestDidFinishNotification MP_API_IOS_DEPRECATED_MACOS_TVOS_PROHIBITED(3.2, 9.0, 10.12.2, 10.12.2, 3.2, 9.0);

// -----------------------------------------------------------------------------
// Timed Metadata

@interface MPMoviePlayerController (MPMoviePlayerTimedMetadataAdditions)

// Returns an array of the most recent MPTimedMetadata objects provided by the media stream.
@property (nonatomic, readonly) NSArray *timedMetadata MP_API_IOS_DEPRECATED_MACOS_TVOS_PROHIBITED(4.0, 9.0, 10.12.2, 10.12.2, 4.0, 9.0);

@end

MP_API_IOS_DEPRECATED_MACOS_TVOS_PROHIBITED(4.0, 9.0, 10.12.2, 10.12.2, 4.0, 9.0)
@interface MPTimedMetadata : NSObject

// A key which identifies a piece of timed metadata.
@property (nonatomic, readonly) NSString *key;

// The namespace of the identifying key.
@property (nonatomic, readonly) NSString *keyspace;

// The object value of the metadata.
@property (nonatomic, readonly) id value;

// The timestamp of the metadata, in the timebase of the media stream.
@property (nonatomic, readonly) NSTimeInterval timestamp;

// A dictionary containing all metadata information associated with this object, which may hold additional key-specific data (see below).
@property (nonatomic, readonly) NSDictionary *allMetadata;

@end

// Posted when new timed metadata arrives.
MP_EXTERN NSString * const MPMoviePlayerTimedMetadataUpdatedNotification MP_API_IOS_DEPRECATED_MACOS_TVOS_PROHIBITED(4.0, 9.0, 10.12.2, 10.12.2, 4.0, 9.0);
MP_EXTERN NSString * const MPMoviePlayerTimedMetadataUserInfoKey MP_API_IOS_DEPRECATED_MACOS_TVOS_PROHIBITED(4.0, 9.0, 10.12.2, 10.12.2, 4.0, 9.0);       // NSDictionary of the most recent MPTimedMetadata objects.

// -----------------------------------------------------------------------------

@interface MPMoviePlayerController (MPMovieLogging)

// Returns an object that represents a snapshot of the network access log. Can be nil.
@property (nonatomic, readonly) MPMovieAccessLog *accessLog MP_API_IOS_DEPRECATED_MACOS_TVOS_PROHIBITED(4.3, 9.0, 10.12.2, 10.12.2, 4.3, 9.0);

// Returns an object that represents a snapshot of the error log. Can be nil.
@property (nonatomic, readonly) MPMovieErrorLog *errorLog MP_API_IOS_DEPRECATED_MACOS_TVOS_PROHIBITED(4.3, 9.0, 10.12.2, 10.12.2, 4.3, 9.0);

@end

// -----------------------------------------------------------------------------
// An MPMovieAccessLog accumulates key metrics about network playback and presents them as a collection of MPMovieAccessLogEvent instances.
// Each MPMovieAccessLogEvent instance collates the data that relates to each uninterrupted period of playback.

MP_API_IOS_DEPRECATED_MACOS_TVOS_PROHIBITED(4.3, 9.0, 10.12.2, 10.12.2, 4.3, 9.0)
@interface MPMovieAccessLog : NSObject <NSCopying>

// Returns the webserver access log into a textual format that conforms to the W3C Extended Log File Format for web server log files.
// For more information see: http://www.w3.org/pub/WWW/TR/WD-logfile.html
@property (nonatomic, readonly) NSData *extendedLogData;

// Returns the string encoding of the extendedLogData property.
@property (nonatomic, readonly) NSStringEncoding extendedLogDataStringEncoding;

// An ordered collection of MPMovieAccessLogEvent instances that represent the chronological sequence of events contained in the access log.
@property (nonatomic, readonly) NSArray *events;

@end

// -----------------------------------------------------------------------------
// An MPMovieErrorLog provides data to identify if, and when, network resource playback failures occured.

MP_API_IOS_DEPRECATED_MACOS_TVOS_PROHIBITED(4.3, 9.0, 10.12.2, 10.12.2, 4.3, 9.0)
@interface MPMovieErrorLog : NSObject <NSCopying>

// Returns the webserver error log into a textual format that conforms to the W3C Extended Log File Format for web server log files.
// For more information see: http://www.w3.org/pub/WWW/TR/WD-logfile.html
@property (nonatomic, readonly) NSData *extendedLogData;

@end

// -----------------------------------------------------------------------------
// An MPMovieAccessLogEvent repesents a single access log entry.

MP_API_IOS_DEPRECATED_MACOS_TVOS_PROHIBITED(4.3, 9.0, 10.12.2, 10.12.2, 4.3, 9.0)
@interface MPMovieAccessLogEvent : NSObject <NSCopying>

// A count of media segments downloaded from the server to this client.
@property (nonatomic, readonly) NSUInteger numberOfSegmentsDownloaded;

@end

// -----------------------------------------------------------------------------
// An MPMovieErrorLogEvent repesents a single error log entry.

MP_API_IOS_DEPRECATED_MACOS_TVOS_PROHIBITED(4.3, 9.0, 10.12.2, 10.12.2, 4.3, 9.0)
@interface MPMovieErrorLogEvent : NSObject <NSCopying>

// The date and time when the error occured.
@property (nonatomic, readonly) NSDate *date;
@end

// -----------------------------------------------------------------------------
// Deprecated methods and properties
// These will be removed in a future release of iOS

@interface MPMoviePlayerController (MPMoviePlayerDeprecated)

// Indicates if the movie player should inherit the application's audio session instead of creating a new session (which would interrupt the application's session).
// Defaults to YES. Setting this property during playback will not take effect until playback is stopped and started again.
@property (nonatomic) BOOL useApplicationAudioSession MP_API_IOS_DEPRECATED_MACOS_TVOS_PROHIBITED(3.2, 6.0, 10.12.2, 10.12.2, 3.2, 6.0);

@end

从代码中,可以看出很多地方是和我们相似的,但他们的定义更合理,更清晰。

代码规范约定

原因

代码规范的重要性,是不言而喻的。好的代码规范,不仅仅能提高代码的可读性,也是团队协作的基础条件,另外也是体现写代码能力的一方面,更通俗点讲是我们 SDK 对外的脸面。

建议

向原生代码靠近,并结合主流代码规范。主要涉及方面:

  1. **命名规则 **
    常量、变量、静态变量、方法、枚举、结构体、宏定义、全局变量、局部变量、文件、文件、类、库等
  2. 代码注释规则
    使用 xcode 自带注释工具,对主要关键点注释
  3. 空行、分块规则
    属性、方法等之间的空行规则;分块主要是 #pragma mark - 的使用
代码摘录
/*********************************************************************
 * 版权所有    MiGu
 *
 * 文件名称:  MGPlayerExtraProperties.h
 * 文件标识:
 * 内容摘要:  播放器额外属性类
 * 其它说明:  sdk外部接口类
 * 作   者:  ciome
 * 创建日期:  2017/4/19
 **********************************************************************/

#import <Foundation/Foundation.h>

@interface MGPlayerExtraProperties : NSObject


/**
 是否使用硬解,默认不使用
 */
@property (nonatomic,assign)    BOOL isHWDecoderEnable;

/**
 http长链接,默认不是长连接
 */
@property (nonatomic,assign)    BOOL isHlsKeepAlive;

/**
 M3u8未读取完就播放,默认不播放
 */
@property (nonatomic,assign)    BOOL isHlsQuickStart;

/**
 是否静音播放,默认非静音
 */
@property (nonatomic,assign)    BOOL isMutePlay;

/**
 Rtmp低延时,默认不开启
 */
@property (nonatomic,assign)    BOOL isRtmpLowLatencyEnable;

/**
 是否自动请求gslb,默认不自动请求
 */
@property (nonatomic,assign)    BOOL isHlsAutoRequestGslb;

/**
 是否支持ipV6,默认不支持
 */
@property (nonatomic,assign)    BOOL isSupportIpV6;

/**
 Hls 超时时间,0~200000000 us,默认30000000 us
 */
@property (nonatomic,assign)    NSInteger hlsTimeoutUsTime;

/**
 Hls直播时,从哪个切片开始播放;[0,-nsegmentcount],默认 0
 */
@property (nonatomic,assign)    NSInteger hlsLiveStartIndex;

/**
 在seeking时缓冲多长时间开始播放,3秒~300秒 , 默认: 20s
 */
@property (nonatomic,assign)    NSInteger minCachedSeekingTime;

/**
 缓冲区时长, 单位 :s,默认 300s
 */
@property (nonatomic,assign)    NSInteger maxBufferCachedTime;

/**
 Flv探测视频大小,[0, 4M] ,单位:字节 , 默认 500 字节
 */
@property (nonatomic,assign)    NSInteger flvProbeSize;


/**
 Airplay激活超时时间 ,默认 12 s
 */
@property (nonatomic,assign)    NSInteger airplayActiveTimeoutTime;


/**
 这个是由域名:ip组成,比如cnclive.miguvideo.com:117.144.227.41,表示cnclive.miguvideo.com所对应的
 */
@property (nonatomic,copy)      NSString *domainAndIpStr;



@end


性能优化

原因

因为之前一直在抓需求,功能实现,并没有特别对性能优化一块做专门的精研,性能优化这一块,我们仍有很大的空间。

建议

影响性能主要表现在内存管理CPU使用率,具体表现在响应速度耗电量。如何高效合理的使用内存和高效率使用CPU,涉及的主要方面:

  • 修饰符的使用
    strong、retain、weak、assing、nonatomic、atomic、readwrite、readonly、copy、unsafe_unretained、synthesize、dynamic 等
  • 内存使用
    避免不必要的内存分配和销毁,减少必要的内存分配和销毁
  • 多线程使用
    在 CPU 空闲时,充分利用 CPU ,提高响应速度

代码优化

原因

因为开发初期的需求混乱、时间仓促等多方面原因,使得代码的结构上并没有一个很好的模块化。

建议

模块化、低耦合

结束语

限于个人对于 iOS 代码的理解,和本自身代码能力,上述可能写的并不完整,敬请谅解

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,928评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,192评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,468评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,186评论 1 286
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,295评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,374评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,403评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,186评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,610评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,906评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,075评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,755评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,393评论 3 320
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,079评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,313评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,934评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,963评论 2 351

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,926评论 25 707
  • 从三月份找实习到现在,面了一些公司,挂了不少,但最终还是拿到小米、百度、阿里、京东、新浪、CVTE、乐视家的研发岗...
    时芥蓝阅读 42,221评论 11 349
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,605评论 18 399
  • Same 是一个慢热型的应用,你得有足够的耐心。 初识 Same 的人,大都会被其简洁的设计所小小惊艳到。不过严格...
    我就是苳苳阅读 920评论 1 4
  • 拍摄手机:红米Note2 手机像素:1000万像素 后期:无处理 观赏内容:1、健身房中窗透自然光和器械的柔 ...
    瞻帚揆玊阅读 201评论 0 0