封装业务类

1.什么是业务类?

业务类:专门处理某项业务(事情)

2.业务类的作用?

把一些业务的业务逻辑封装起来,其它类需要处理这些业务的时候,直接调用业务类的方法就可以了
大大减少了其它类中的代码量,让代码看起来更整洁,可读性更好

3.业务类的规范

3.1 在类的上面,注明这个类的功能(作用)
让其它人一看到这个类就知道是干什么用的,减少沟通成本

   //  Created by xiaomage on 16/7/31.
 //  Copyright © 2016年 XiaoMaG. All rights reserved.
 //  专门处理文件   (标注方式一)
   /**
  *专门处理文件  (标注方式二)
  */
 @interface XTFileManager : NSObject

3.2 每个方法或属性,都需要使用文档注释
让其他人能快速掌握这个类怎么用,减少沟通成本

 /**
  * 
  *作用:指定一个文件夹路径,获取文件夹尺寸
  *参数(directoryPath):文件夹路径
  *返回值:文件夹尺寸  */
+(NSInteger)getSizeOfDirectoryPath:(NSString *)directoryPath;

3.3 每个方法一定要严谨
如果别人不按照方法的规定方式来使用,就报错(抛异常),这样别人就不会认为是方法的问题,能更好的处理错误
例如做一些必要的判断:判断传入的内容不是我们需要的格式,就抛异常
> // 判断下是否是隐藏文件
if ([subPath hasPrefix:@".DS"]) continue;
// 是否是文件夹 BOOL isDirectory;
// 判断文件是否存在,并且是否是文件夹
[mgr fileExistsAtPath:filePath isDirectory:&isDirectory];
if (isDirectory) continue;

3.4 怎么抛异常?
> if (!isExist || !isDirectory) {
// 抛异常:NSException
// name:异常名称
// reason:异常原因
方式一: //NSException *excp = [NSException exceptionWithName:@"FileError" reason:@"笨蛋,传入的路径可
能为空,或者不是文件夹路径,仔细好好检查吧" userInfo:nil];
//[excp raise];
方式二:@throw [NSException exceptionWithName:@"FileError" reason:@"笨蛋,传入的路径可能为空,或者不
是文件夹路径,仔细好好检查吧" userInfo:nil];
}

4.怎么封装业务类?

4.1第一种方法:常规方法封装,直接把方法的声明和实现拷贝到业务类中
缺点: 计算文件夹缓存尺寸,如果文件里面子文件比较多,比较耗时

  + (void)removeDirectory:(NSString *)directoryPath
 {
     NSFileManager *mgr = [NSFileManager defaultManager];
     BOOL isDirectory;
     BOOL isExist = [mgr fileExistsAtPath:directoryPath isDirectory:&isDirectory];

     if (!isExist || !isDirectory) {
         // 抛异常:NSException
         @throw [NSException exceptionWithName:@"FileError" reason:@"笨蛋,传入的路径可能为空,或者不是文
           件夹路径,仔细好好检查吧" userInfo:nil];
     }
     // 1.删除Cache文件夹
     [mgr removeItemAtPath:directoryPath error:nil];
     // 2.创建新Cache文件夹
     [mgr createDirectoryAtPath:directoryPath withIntermediateDirectories:YES attributes:nil error:nil];
 }

 + (NSInteger)getSizeOfDirectoryPath:(NSString *)directoryPath
 {
     // 1.获取文件管理者对象
     NSFileManager *mgr = [NSFileManager defaultManager];
     // 判断传入文件夹路径存在
     BOOL isDirectory;
     BOOL isExist = [mgr fileExistsAtPath:directoryPath isDirectory:&isDirectory];

     if (!isExist || !isDirectory) {
         // 抛异常:NSException
         // name:异常名称
         // reason:异常原因
      //NSException *excp = [NSException exceptionWithName:@"FileError" reason:@"笨蛋,传入的路径可能为
           空,或者不是文件夹路径,仔细好好检查吧" userInfo:nil];
      // [excp raise];
    @throw [NSException exceptionWithName:@"FileError" reason:@"笨蛋,传入的路径可能为空,或者不是文件  
         夹路径,仔细好好检查吧" userInfo:nil];
     }
          NSInteger totalSize = 0;
          // 2.获取所有文件(传递文件夹路径)
          // Path:文件夹路径
          // subpathsAtPath:获取一个文件夹中所有子路径,包含多级路径
          NSArray *subPaths = [mgr subpathsAtPath:directoryPath];
          // 3.遍历所有文件
          for (NSString *subPath in subPaths) {
         // 4.拼接完整文件名
         NSString *filePath = [directoryPath stringByAppendingPathComponent:subPath];
         // 判断下是否是隐藏文件
         if ([subPath hasPrefix:@".DS"]) continue;
         // 是否是文件夹
         BOOL isDirectory;
         // 判断文件是否存在,并且是否是文件夹
         [mgr fileExistsAtPath:filePath isDirectory:&isDirectory];
         if (isDirectory) continue;
         // 5.attributesOfItemAtPath:传入文件全路径,就能获取文件属性
         NSDictionary *attr = [mgr attributesOfItemAtPath:filePath error:nil];
         // 6.把文件尺寸累加
         totalSize += [attr fileSize];
     }
          return totalSize;
 }

4.2 第二种方法:block封装业务类 开启子线程,把耗时操作放到子线程中执行
注意:刷新UI的操作一定要回到主线程执行 ,
用block作为参数,开启异步任务,一定不要返回数据
4.3 为什么使用block作为参数,开启异步任务,一定不要返回数据?
异步函数的特点:
01 具备开线程的能力
02 执行任务的方式:异步
异步执行:我开始执行后,可以不用等我执行完,就执行后面的任务
由于异步函数异步执行,如果有返回值,返回值要放到主线程中执行,
那么执行到异步函数的时候,会直接跳过异步函数执行返回操作,这个时候返回值还没计算出来,会造成数据错乱

4.4 怎么解决block作为参数,外界需要返回值的问题?
让带有参数的block 作为参数,把需要返回的数据,赋值给block的参数,让blcok传递出去就就可以了

4.5 block作为参数的格式怎么写?
如果不会的话,就把AFN里面的block参数拷过来改一下

-(NSURLSessionDataTask *)GET:(NSString *)URLString parameters:(id)parameters progress:(void (^)(NSProgress * _Nonnull))downloadProgress success:(void (^)(NSURLSessionDataTask * _Nonnull, id _Nullable))success failure:(void (^)(NSURLSessionDataTask * _Nullable, NSError * _Nonnull))failure
// 异步任务,不要返回数据
+(void)getSizeOfDirectoryPath:(NSString *)directoryPath completion:(void (^)(NSInteger totalSize))completion
{
dispatch_async(dispatch_get_global_queue(0, 0), ^{       
// 子线程执行        
// 1.获取文件管理者对象        
NSFileManager *mgr = [NSFileManager defaultManager];        
// 判断传入文件夹路径存在        
BOOL isDirectory;        
BOOL isExist = [mgr fileExistsAtPath:directoryPath isDirectory:&isDirectory];               
if (!isExist || !isDirectory) {            
@throw [NSException exceptionWithName:@"FileError" reason:@"笨蛋,传入的路径可能为空,或者不是文件夹路径,仔细好好检查吧" userInfo:nil];
    }
    NSInteger totalSize = 0;
    // 2.获取所有文件(传递文件夹路径)        
NSArray *subPaths = [mgr subpathsAtPath:directoryPath];        
// 3.遍历所有文件        
for (NSString *subPath in subPaths) {            
// 4.拼接完整文件名            
NSString *filePath = [directoryPath stringByAppendingPathComponent:subPath];                        
// 判断下是否是隐藏文件
        if ([subPath hasPrefix:@".DS"]) continue;
        // 是否是文件夹            
BOOL isDirectory;            
// 判断文件是否存在,并且是否是文件夹            
[mgr fileExistsAtPath:filePath isDirectory:&isDirectory];
        if (isDirectory) continue;
  // 5.attributesOfItemAtPath:传入文件全路径,就能获取文件属性            
NSDictionary *attr = [mgr attributesOfItemAtPath:filePath error:nil];            
// 6.把文件尺寸累加
        totalSize += [attr fileSize];
    }
    // 一定要记得回到主线程        dispatch_sync(dispatch_get_main_queue(), ^{
        if (completion) {
      注意:()内可以写这个方法定义的任何值,但要和block的参数类型相同,最后括号内的值会传给Block的参数
            completion(totalSize);       
        }
    });         
}); 
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,588评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,456评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,146评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,387评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,481评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,510评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,522评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,296评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,745评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,039评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,202评论 1 343
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,901评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,538评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,165评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,415评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,081评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,085评论 2 352

推荐阅读更多精彩内容

  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,608评论 18 399
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,973评论 25 707
  • 唐七公子的《三生三世枕上书》中有这么一段:白浅曾经教导凤九,做神仙最重要的是不怕丢脸,因不怕丢脸是一种勇气,赐予一...
    燕臻阅读 663评论 0 1
  • 今天早上雨下得好大,6:30就给吵醒了,起来收衣服,然后继续睡觉,不过雨越下越大,太吵了,睡不着,老公可睡得挺香,...
    慧蘭阅读 133评论 0 0
  • 每天一小步,人生一大步。由于调班的原因,我的锻炼也提前了,虽然有点困,还是要坚持
    黄英涛阅读 55评论 1 1