-
一、OC计算和清除缓存方法
- 使用NSObject的分类专门计算缓存,封装好的工具类。此分类中使用了多线程和Block作为回调处理。
-
h
// NSObject+FileManager.h
// 04-MGWeChat
// Created by ming on 14/12/21.
// Copyright © 2014年 ming. All rights reserved.
#import
@interface NSObject (FileManager)
/** 类方法获取文件的大小 有回调 */
+ (void)getFileSizeWithFileName:(NSString *)path completion:(void(^)(NSInteger totalSize))completionBlock;
/** 对象方法获取文件的大小 有回调 */
- (void)getFileSizeWithFileName:(NSString *)path completion:(void(^)(NSInteger totalSize))completionBlock;
/** 类方法获取caches路径 */
+ (NSString *)cachesPath;
/** 对象方法获取caches路径 */
- (NSString *)cachesPath;
/** 类方法移除caches 有回调 */
+ (void)removeCachesWithCompletion:(void(^)())completionBlock;
/** 对象方法移除caches 有回调 */
- (void)removeCachesWithCompletion:(void(^)())completionBlock;
@end
-
.m
// NSObject+FileManager.m
// 04-MGWeChat
// Created by ming on 14/13/21.
// Copyright © 2014年 ming. All rights reserved.
#import "NSObject+FileManager.h"
@implementation NSObject (FileManager)
// 异步方法,不需要返回值
// 异步方法使用回调,block
// 获取文件尺寸
+ (void)getFileSizeWithFileName:(NSString *)path completion:(void(^)(NSInteger totalSize))completionBlock{
// 在子线程中计算文件大小
dispatch_async(dispatch_get_global_queue(0, 0), ^{
// 1.文件总大小
NSInteger totalSize = 0;
// 2.创建文件管理者
NSFileManager *fileManager = [NSFileManager defaultManager];
// 3.判断文件存不存在以及是否是文件夹
BOOL isDirectory = NO;
BOOL isFileExist = [fileManager fileExistsAtPath:path isDirectory:&isDirectory];
if (!isFileExist) return; // 文件不存在
if (isDirectory) { // 是文件夹
NSArray *subPaths = [fileManager subpathsAtPath:path];
for (NSString *subPath in subPaths) {
NSString *filePath = [path stringByAppendingPathComponent:subPath];
BOOL isDirectory = NO;
BOOL isExistFile = [fileManager fileExistsAtPath:filePath isDirectory:&isDirectory];
if (!isDirectory && isExistFile && ![filePath containsString:@"DS"]) {
totalSize += [fileManager attributesOfItemAtPath:filePath error:nil].fileSize;
}
}
}else{ // 不是文件夹
totalSize = [fileManager attributesOfItemAtPath:path error:nil].fileSize ;
}
// 回到主线程
dispatch_sync(dispatch_get_main_queue(), ^{
if (completionBlock) {
completionBlock(totalSize);
}
});
});
}
- (void)getFileSizeWithFileName:(NSString *)path completion:(void (^)(NSInteger)) completionBlock{
[NSObject getFileSizeWithFileName:path completion:completionBlock];
}
/** 获取路径 */
+ (NSString *)cachesPath{
return [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject];
}
- (NSString *)cachesPath{
return [NSObject cachesPath];
}
/** 删除caches */
+ (void)removeCachesWithCompletion:(void(^)())completionBlock{
[[[NSOperationQueue alloc] init] addOperationWithBlock:^{
// 创建文件管理者
NSFileManager *fileManager = [NSFileManager defaultManager];
// 删除文件
NSString *path = self.cachesPath;
BOOL isDirectory = NO;
BOOL isfileExist = [fileManager fileExistsAtPath:path isDirectory:&isDirectory];
if (!isfileExist) return ;
if (isDirectory) {
// 迭代器
NSDirectoryEnumerator *enumerator = [fileManager enumeratorAtPath:path];
for (NSString *subPath in enumerator) {
NSString *filePath = [path stringByAppendingPathComponent:subPath];
// 移除文件Or文件夹
[fileManager removeItemAtPath:filePath error:nil];
}
}
// 回到主线程
[[NSOperationQueue mainQueue] addOperationWithBlock:^{
if (completionBlock) {
completionBlock();
}
}];
}];
}
- (void)removeCachesWithCompletion:(void(^)())completionBlock{
[NSObject removeCachesWithCompletion:completionBlock];
}
@end
- 二、#Swift2.x计算和清除缓存的方法
- 使用NSObject的分类专门计算缓存,封装好的工具类。此分类中使用了多线程和闭包作为回调处理。
// NSObject+FileManager.swift
// Created by ming on 16/10/30.
// Copyright © 2016年 ming. All rights reserved.
import UIKit
/* 计算缓存 */
extension NSObject {
/* 类方法:
异步方法
使用回调,block
获取文件尺寸
*/
class func getFileSizeWithFileName(path: String,completionBlock:(totalSize: UInt64) -> () ) {
// 在子线程中计算文件大小
dispatch_async(dispatch_get_global_queue(0, 0)) { () -> Void in
// 1.文件总大小
var totalSize: UInt64 = 0;
// 2.创建文件管理者
let fileManager = NSFileManager.defaultManager()
// 3.判断文件存不存在以及是否是文件夹
var isDirectory: ObjCBool = ObjCBool(false)
let isFileExist = fileManager.fileExistsAtPath(path , isDirectory: &isDirectory)
if (!isFileExist) {return} // 文件不存在
if (isDirectory) { // 是文件夹
guard let subPaths = fileManager.subpathsAtPath(path) else { return }
for subPath in subPaths {
let filePath = path.stringByAppendingFormat("/%@", subPath)
var isDirectory: ObjCBool = ObjCBool(false)
let isExistFile = fileManager.fileExistsAtPath(filePath, isDirectory: &isDirectory)
if (!isDirectory && isExistFile && !filePath.containsString("DS")) {
if let attr: NSDictionary = try? fileManager.attributesOfItemAtPath(path) {
totalSize += attr.fileSize()
}
}
}
}else{ // 不是文件夹
if let attr: NSDictionary = try? fileManager.attributesOfItemAtPath(path) {
totalSize += attr.fileSize()
}
}
// 回到主线程,把计算的大小通过壁报传递出去
dispatch_async(dispatch_get_main_queue()) { () -> Void in
completionBlock(totalSize: totalSize)
}
}
}
// 对象方法:根据缓存路径去计算缓存文件的大小,通过闭包返回缓存大小
func getFileSizeWithFileName(path: String, completionBlock:(totalSize: UInt64) -> ()) {
NSObject.getFileSizeWithFileName(path, completionBlock:completionBlock)
}
}
/** 获取缓存路径 */
extension NSObject {
class func cachesPath() -> String {
return NSSearchPathForDirectoriesInDomains(.CachesDirectory, .UserDomainMask, true).last!
}
func cachesPath() -> String {
return NSObject.cachesPath()
}
}
/** 清除缓存 */
extension NSObject {
class func removeCachesWithCompletion(completionBlock: ()->()) {
NSOperationQueue().addOperationWithBlock { () -> Void in
// 创建文件管理者
let fileManager = NSFileManager.defaultManager()
// 删除文件
let path = self.cachesPath() as String
var isDirectory: ObjCBool = ObjCBool(false)
let isFileExist = fileManager.fileExistsAtPath(path , isDirectory: &isDirectory)
if (!isFileExist) { return } // 文件不存在
if (isDirectory) {
guard let enumerator = fileManager.enumeratorAtPath(path) else { return }
for subPath in enumerator {
let subPath = subPath as? String
let filePath = path.stringByAppendingFormat("/%@", subPath!)
// 移除文件Or文件夹
try! fileManager.removeItemAtPath(filePath)
}
}
// 回到主线程
NSOperationQueue.mainQueue().addOperationWithBlock({ () -> Void in
completionBlock()
})
}
}
func removeCachesWithCompletion(completionBlock: ()->()) {
NSObject.removeCachesWithCompletion(completionBlock)
}
}
-
github
项目 | 简介 |
---|---|
MGDS_Swif | 逗视视频直播 |
MGMiaoBo | 喵播视频直播 |
MGDYZB | 斗鱼视频直播 |
MGDemo | n多小功能合集 |
MGBaisi | 高度仿写百思 |
MGSinaWeibo | 高度仿写Sina |
MGLoveFreshBeen | 一款电商App |
MGWeChat | 小部分实现微信功能 |
MGTrasitionPractice | 自定义转场练习 |
DBFMDemo | 豆瓣电台 |
MGPlayer | 一个播放视频的Demo |
MGCollectionView | 环形图片排布以及花瓣形排布 |
MGPuBuLiuDemo | 瀑布流--商品展 |
MGSlideViewDemo | 一个简单点的侧滑效果,仿QQ侧滑 |
MyResume | 一个展示自己个人简历的Demo |
GoodBookDemo | 好书 |
-
1、直播喵播MGMiaoBo下载
-
2、逗视:逗你玩的直播App,可下载试玩
-
看下效果
逗视介绍1.gif
逗视介绍2.gif
扫一扫,关注我
-
轻轻点击,关注我
-
轻轻点击,在慕课网关注我
-
关注我
-
轻轻点击,关注我微博
-
浏览我的GitHub
-
扫一扫,关注我的公众号