Round 2----->緩存功能實現(xiàn)
在interface中添加下載按鈕
@property (nonatomic,strong) UIButton* downLoadBtn; //下載按鈕
按照之前的步驟,在initMJPlayerFrame中對添加的控件進行布局莉御,并添加手勢來對控制界面進行顯示隱藏操作
/*界面 ROUND 2********************************************************************************************/
self.downLoadBtn = [UIButton buttonWithType:UIButtonTypeCustom];
[self.downLoadBtn setImage:[UIImage imageNamed:@"MJPlayer_download"] forState:UIControlStateNormal];
[self.downLoadBtn setImage:[UIImage imageNamed:@"MJPlayer_not_download"] forState:UIControlStateSelected];
[self.downLoadBtn addTarget:self action:@selector(downLoadBtnPress:) forControlEvents:UIControlEventTouchUpInside];
[self addSubview:self.downLoadBtn];
[self.downLoadBtn mas_makeConstraints:^(MASConstraintMaker *make) {
make.centerY.equalTo(self);
make.right.equalTo(self).offset(-20);
make.height.equalTo(@(49));
make.width.equalTo(@(40));
}];
//添加手勢
singleTapGestureRecognizer = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(singleTap:)];
[singleTapGestureRecognizer setNumberOfTapsRequired:1];
[self addGestureRecognizer:singleTapGestureRecognizer];
//延遲隱藏控制界面
[self showAndHideControl:0];
//顯示隱藏控制界面
-(void)showAndHideControl:(NSInteger)alphaNum
{
__weak typeof (self)self_ = self;
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
[UIView animateWithDuration:0.2f animations:^{
self_.bottomControlView.alpha = alphaNum;
self_.downLoadBtn.alpha = alphaNum;
}];
});
}
-(void)singleTap:(UITapGestureRecognizer*)tapGesture
{
__weak typeof (self)self_ = self;
[UIView animateWithDuration:0.2f animations:^{
self_.bottomControlView.alpha = 1;
self_.downLoadBtn.alpha = 1;
} completion:^(BOOL finished) {
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
[UIView animateWithDuration:0.2f animations:^{
self_.bottomControlView.alpha = 0;
self_.downLoadBtn.alpha = 0;
}];
});
}];
}
在項目中新建一個下載類 MJDownLoad繼承于NSObject恃鞋,使用單例創(chuàng)建對象规惰,聲明下載方法及本地方法袖订,待會在.m文件中實現(xiàn)
MJDownLoad.h
//
// MJDownLoad.h
// MJAVPlayer
//
// Created by 馬家俊 on 16/11/4.
// Copyright ? 2016年 MJJ. All rights reserved.
//
#import <Foundation/Foundation.h>
#import <AFNetworking.h>
#define UserDefaults [NSUserDefaults standardUserDefaults]
#define GetFileName [[strUrl stringByReplacingOccurrencesOfString:@"/" withString:@""] stringByReplacingOccurrencesOfString:@"." withString:@""]
@interface MJDownLoad : NSObject
/*!單例模式獲取MJDownLoad對象
*\\returns returns: 返回ParkApply對象
*/
+ (MJDownLoad *)shareInstanceManager;
/*!獲取url進行下載
*/
-(void)downLoadWithUrl:(NSString*)strUrl;
/*!獲取本地url
*\\returns returns: 返回NSString 本地URL或者空字符串
*/
-(NSString*)getLocalVedio:(NSString*)strUrl;
@end
MJDownload單例
static MJDownLoad *g_MJDownLoad;
+ (MJDownLoad *)shareInstanceManager
{
@synchronized(self)
{
if (!g_MJDownLoad)
{
g_MJDownLoad = [[MJDownLoad alloc] init];
}
}
return g_MJDownLoad;
}
downLoad方法德撬,使用的是 downloadTaskWithRequest,獲取URL后先去cache中查看是否有
VedioCache這個文件夾固歪,如果沒有則直接代碼創(chuàng)建該文件夾蒜鸡,之后進行下載
-(void)downLoadWithUrl:(NSString*)strUrl
{
//獲取cache路徑,該文件夾中的文件不會被同步牢裳,清楚緩存直接刪除該文件夾下所有子文件即可
NSArray* paths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory,NSUserDomainMask, YES) ;
NSString *documentsDire = [paths objectAtIndex:0];
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
//以獲取到的視頻文件名稱作為存儲文件名
NSString *fileName = GetFileName;
NSString *fileNameWithMP4 = [fileName stringByAppendingString:@".mp4"];
NSFileManager *fileManager = [[NSFileManager alloc] init];
//查看是否有該路徑逢防,如果沒有則創(chuàng)建
NSString* createPath = [NSString stringWithFormat:@"%@/VedioCache/%@", documentsDire,fileName];
if (![[NSFileManager defaultManager] fileExistsAtPath:createPath])
{
[fileManager createDirectoryAtPath:createPath withIntermediateDirectories:YES attributes:nil error:nil];
}else
{
NSLog(@"FileDir is exists.");
}
//視頻緩存最終路徑
NSString *fullPath = [NSString stringWithFormat:@"%@/%@",createPath,fileNameWithMP4];
NSURL *url = [NSURL URLWithString:strUrl];
NSURLRequest *requst = [NSURLRequest requestWithURL:url];
//開啟下載任務
NSURLSessionDownloadTask *task = [manager downloadTaskWithRequest:requst progress:nil destination:^NSURL * _Nonnull(NSURL * _Nonnull targetPath, NSURLResponse * _Nonnull response) {
return [NSURL fileURLWithPath:fullPath];
} completionHandler:^(NSURLResponse * _Nonnull response, NSURL * _Nullable filePath, NSError * _Nullable error) {
[UserDefaults setObject:fullPath forKey:fileName];
UIAlertView* alert = [[UIAlertView alloc]initWithTitle:@"提示" message:@"下載完成!" delegate:self cancelButtonTitle:@"確定" otherButtonTitles:nil, nil];
[alert show];
}];
[task resume];
}
下載完成后獲取下載文件蒲讯,存在該文件則返回路徑忘朝,否則返回空字符串
-(NSString*)getLocalVedio:(NSString *)strUrl
{
NSString* localUrl = [UserDefaults objectForKey:GetFileName];
if (localUrl) {
return localUrl;
}else
{
return @"";
}
}
完成MJDownLoad之后要對MJPlayerView進行調(diào)整,讓player可以在本地存在緩存時不再請求網(wǎng)絡數(shù)據(jù)
在initMJPlayer這個方法中判帮,對playerItem進行初始化的時候去判定是否存在本地緩存局嘁,存在則用本地緩存去初始化溉箕,否則正常流程
if (![[[MJDownLoad shareInstanceManager]getLocalVedio:vedioUrl] isEqualToString:@""]) {
NSURL *sourceMovieUrl = [NSURL fileURLWithPath:[[MJDownLoad shareInstanceManager]getLocalVedio:vedioUrl]];
AVAsset *movieAsset = [AVURLAsset URLAssetWithURL:sourceMovieUrl options:nil];
self.playerItem = [AVPlayerItem playerItemWithAsset:movieAsset];
self.downLoadBtn.selected = YES;
}else
{
self.playerItem = [AVPlayerItem playerItemWithURL:videoUrl];
[[MJDownLoad shareInstanceManager]downLoadWithUrl:vedioUrl];
}
最后對點擊下載按鈕的事件進行實現(xiàn)
#pragma Mark----downLoadBtn下載按鈕點擊事件
-(void)downLoadBtnPress:(UIButton*)sender
{
if(!sender.selected)
{
[[MJDownLoad shareInstanceManager]downLoadWithUrl:vedioUrl];
}else
{
sender.userInteractionEnabled = NO;
}
}
下載功能實現(xiàn)完成,下一步實現(xiàn)下載列表悦昵,突然發(fā)現(xiàn)有一步做的多余了肴茄,不需要用到NSUserdefault,直接組裝路徑查看是否存在該路徑即可知道是否存在緩存
未完待續(xù)--------------------------------------------------------