? ? ? ?AVPlayer相信iOS從業人員來說都是比較熟悉的,大多數人都會用它實現基本或者復雜的播放功能,但是相信有很多人博主一樣重來都沒有關注過是否有緩存的產生,所以今天這個博客主要就是講訴博主找出緩存的歷程。
? ? 博主以前主要是做電商類的APP所以緩存處理想必大家都知道,簡單的:
```
[[SDImageCache sharedImageCache] getSize];
```
簡簡單單一句話,然而到了博主現在負責的項目中發現根本不行完全獲取不到視屏播放的人任何東西,由于AVPlayer只需要傳入一個url就能實現播放所以根本無法控制緩存存放的地方,所以就開始了我的一步步的尋找之路(方便大家直觀的了解這是這是博主解決之后打印出來能明顯看的出來SD獲取不到,視屏緩存轉化成了MB,SD還是用的字節沒有進行處理)。
第一步:首先我們要考慮究竟我們播放視屏會不會有緩存
為了證明我們播放視屏的同時確實會產生緩存所以博主打印了沙盒路徑,每一次播放視屏時查看一下文件夾大小,發現文件夾真的會變大(博主在這就不貼圖了,有興趣的小伙伴可以自己去親身體驗一下),這一下就明了了:確定了我們每次播放視屏的時候確實會出現緩存只是重來沒有自己去獲取過。
第二步:找到緩存究竟在哪?
現在我們已經進入了沙盒路徑我們可以在里面瘋狂的找緩存了,但是在Caches文件夾里面你只會找到圖片的緩存根本找不到視屏的緩存。
大家可以調大自己主頁的cell高度讓后,邊滑動,邊觀察,會發現這個文件夾里面全是展示圖片的緩存,這時候我也無奈了!!!!!
可是回頭想想緩存竟然沒有,會不會在別的文件夾->Documents這個不可能(蘋果會備份)->所以緩存文件只能是在tmp文件夾
果然在tmp里面發現了東西,原來我們找了半天的東西在這!!!!
第三步:該不該由自己操作
大家都知道沙盒的tmp文件夾是在我們退出APP之后會自動清除,那么這時候問題就來了我們自己清除還是交給系統解決(博主實測表示這個清除時靈時不靈)。
所以這個時候就要看大家項目播放的視屏大小及視屏播放的頻率了,博主為了小心至上(其實還是需求要求)所以就加上了這個清除緩存的工能這個時候呢。就要我們自己來獲取到這個文件夾的大小了
```
//獲取緩存文件夾所在位置
cachePath = [NSTemporaryDirectory() stringByAppendingString:@"MediaCache"];
NSLog(@"視屏緩存%f",[self getSizeWithFilePath:cachePath]);
//獲取文件大小
- (double)getSizeWithFilePath:(NSString *)path{
// 1.獲得文件夾管理者
NSFileManager *manger = [NSFileManager defaultManager];
// 2.檢測路徑的合理性
BOOL dir = NO;
BOOL exits = [manger fileExistsAtPath:path isDirectory:&dir];
if (!exits) return 0;
// 3.判斷是否為文件夾
if (dir) { // 文件夾, 遍歷文件夾里面的所有文件
// 這個方法能獲得這個文件夾下面的所有子路徑(直接\間接子路徑)
NSArray *subpaths = [manger subpathsAtPath:path];
int totalSize = 0;
for (NSString *subpath in subpaths) {
NSString *fullsubpath = [path stringByAppendingPathComponent:subpath];
BOOL dir = NO;
[manger fileExistsAtPath:fullsubpath isDirectory:&dir];
if (!dir) { // 子路徑是個文件
NSDictionary *attrs = [manger attributesOfItemAtPath:fullsubpath error:nil];
totalSize += [attrs[NSFileSize] intValue];
}
}
return totalSize / (1024 * 1024.0);
} else { // 文件
NSDictionary *attrs = [manger attributesOfItemAtPath:path error:nil];
return [attrs[NSFileSize] intValue]/ (1024.0 * 1024.0) ;//
}
}
//清除緩存? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 文件路徑
[[NSFileManager defaultManager] removeItemAtPath:cachePath error:nil];
```
以上就是樓主解決這個需求的思考及實現的方式,希望對大家有幫助