引文
由于之前开发时间仓促,需求混乱、不明确 ,及公司内部、组内成员等多方面因素影响,我们的代码虽然满足了各方面的需求,实现了强大的功能;但代码本身还有较大优化的空间。为方便以后代码的迭代,和提高代码本身的质量 ,及提高 SDK 本身执行效率和性能,参考多方面资料,特提出此提议。
核心目标
- MGPlayerController 重新定义
- 代码规范约定
- 性能优化
- 代码优化
MGPlayerController 重新定义
原因
之前的 MGPlayerController 定义混乱 ,层次不够清晰,不仅会造成上层使用不方便 ,还会导致代码迭代困难。
建议
向 iOS 自带 MPMoviePlayerController 类靠近 ,重新定义 MGPlayerController 类 ;并在此基础上定义出更符合我们本身需求的类。主要涉及到以下几个方面:
- 分类规则
- 类扩展
- 协议使用
- 类继承
摘录 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 对外的脸面。
建议
向原生代码靠近,并结合主流代码规范。主要涉及方面:
- **命名规则 **
常量、变量、静态变量、方法、枚举、结构体、宏定义、全局变量、局部变量、文件、文件、类、库等 -
代码注释规则
使用 xcode 自带注释工具,对主要关键点注释 -
空行、分块规则
属性、方法等之间的空行规则;分块主要是 #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 代码的理解,和本自身代码能力,上述可能写的并不完整,敬请谅解
网友评论