zoukankan      html  css  js  c++  java
  • 封装业务类

    1.什么是业务类?
         业务类:专门处理某项业务(事情)
     
    2.业务类的作用?
         把一些业务的业务逻辑封装起来,其它类需要处理这些业务的时候,直接调用业务类的方法就可以了
         大大减少了其它类中的代码量,让代码看起来更整洁,可读性更好
     
    3.业务类的规范
         3.1 在类的上面,注明这个类的功能(作用)
              让其它人一看到这个类就知道是干什么用的,减少沟通成本
    1        //  Created by XT on 16/7/31.
    2      //  Copyright © 2016年 XT. All rights reserved.
    3      //  专门处理文件   (标注方式一)
    4  
    5        /**
    6       *专门处理文件  (标注方式二)
    7       */
    8      @interface XTFileManager : NSObject
     
         3.2 每个方法或属性,都需要使用文档注释
              让其他人能快速掌握这个类怎么用,减少沟通成本
         /**
          * 
          *作用:指定一个文件夹路径,获取文件夹尺寸
          *参数(directoryPath):文件夹路径
          *返回值:文件夹尺寸
         */
    + (NSInteger)getSizeOfDirectoryPath:(NSString *)directoryPath;
     
         3.3 每个方法一定要严谨
              如果别人不按照方法的规定方式来使用,就报错(抛异常),这样别人就不会认为是方法的问题,能更好的处理错误
              例如做一些必要的判断:判断传入的内容不是我们需要的格式,就抛异常
    1            // 判断下是否是隐藏文件
    2         if ([subPath hasPrefix:@".DS"]) continue;
    3         // 是否是文件夹
    4         BOOL isDirectory;
    5         // 判断文件是否存在,并且是否是文件夹
    6         [mgr fileExistsAtPath:filePath isDirectory:&isDirectory];
    7         if (isDirectory) continue;
     
         3.4 怎么抛异常?
     1                if (!isExist || !isDirectory) {
     2              // 抛异常:NSException
     3              // name:异常名称
     4              // reason:异常原因
     5       方式一: //NSException *excp = [NSException exceptionWithName:@"FileError" reason:@"笨蛋,传入的路径可
     6                  能为空,或者不是文件夹路径,仔细好好检查吧" userInfo:nil];
     7                //[excp raise];
     8        方式二:@throw [NSException exceptionWithName:@"FileError" reason:@"笨蛋,传入的路径可能为空,或者不
     9                    是文件夹路径,仔细好好检查吧" userInfo:nil];
    10     }
    4.怎么封装业务类?
         4.1第一种方法:常规方法封装,直接把方法的声明和实现拷贝到业务类中
              缺点: 计算文件夹缓存尺寸,如果文件里面子文件比较多,比较耗时
     1       + (void)removeDirectory:(NSString *)directoryPath
     2      {
     3          NSFileManager *mgr = [NSFileManager defaultManager];
     4          BOOL isDirectory;
     5          BOOL isExist = [mgr fileExistsAtPath:directoryPath isDirectory:&isDirectory];
     6    
     7          if (!isExist || !isDirectory) {
     8              // 抛异常:NSException
     9              @throw [NSException exceptionWithName:@"FileError" reason:@"笨蛋,传入的路径可能为空,或者不是文
    10                件夹路径,仔细好好检查吧" userInfo:nil];
    11          }
    12          // 1.删除Cache文件夹
    13          [mgr removeItemAtPath:directoryPath error:nil];
    14          // 2.创建新Cache文件夹
    15          [mgr createDirectoryAtPath:directoryPath withIntermediateDirectories:YES attributes:nil error:nil];
    16      }
    17  
    18      + (NSInteger)getSizeOfDirectoryPath:(NSString *)directoryPath
    19      {
    20          // 1.获取文件管理者对象
    21          NSFileManager *mgr = [NSFileManager defaultManager];
    22          // 判断传入文件夹路径存在
    23          BOOL isDirectory;
    24          BOOL isExist = [mgr fileExistsAtPath:directoryPath isDirectory:&isDirectory];
    25  
    26          if (!isExist || !isDirectory) {
    27              // 抛异常:NSException
    28              // name:异常名称
    29              // reason:异常原因
    30           //NSException *excp = [NSException exceptionWithName:@"FileError" reason:@"笨蛋,传入的路径可能为
    31                空,或者不是文件夹路径,仔细好好检查吧" userInfo:nil];
    32           // [excp raise];
    33         @throw [NSException exceptionWithName:@"FileError" reason:@"笨蛋,传入的路径可能为空,或者不是文件  
    34              夹路径,仔细好好检查吧" userInfo:nil];
    35          }
    36               NSInteger totalSize = 0;
    37               // 2.获取所有文件(传递文件夹路径)
    38               // Path:文件夹路径
    39               // subpathsAtPath:获取一个文件夹中所有子路径,包含多级路径
    40               NSArray *subPaths = [mgr subpathsAtPath:directoryPath];
    41               // 3.遍历所有文件
    42               for (NSString *subPath in subPaths) {
    43              // 4.拼接完整文件名
    44              NSString *filePath = [directoryPath stringByAppendingPathComponent:subPath];
    45              // 判断下是否是隐藏文件
    46              if ([subPath hasPrefix:@".DS"]) continue;
    47              // 是否是文件夹
    48              BOOL isDirectory;
    49              // 判断文件是否存在,并且是否是文件夹
    50              [mgr fileExistsAtPath:filePath isDirectory:&isDirectory];
    51              if (isDirectory) continue;
    52              // 5.attributesOfItemAtPath:传入文件全路径,就能获取文件属性
    53              NSDictionary *attr = [mgr attributesOfItemAtPath:filePath error:nil];
    54              // 6.把文件尺寸累加
    55              totalSize += [attr fileSize];
    56          }
    57               return totalSize;
    58      }
    59  
         4.2 第二种方法:block封装业务类 开启子线程,把耗时操作放到子线程中执行
              注意:刷新UI的操作一定要回到主线程执行 ,
                      用block作为参数,开启异步任务,一定不要返回数据
         4.3 为什么使用block作为参数,开启异步任务,一定不要返回数据?
              异步函数的特点:     
                   01 具备开线程的能力
                      02 执行任务的方式:异步
                   异步执行:我开始执行后,可以不用等我执行完,就执行后面的任务
              由于异步函数异步执行,如果有返回值,返回值要放到主线程中执行,
              那么执行到异步函数的时候,会直接跳过异步函数执行返回操作,这个时候返回值还没计算出来,会造成数据错乱
     
         4.4 怎么解决block作为参数,外界需要返回值的问题?        
              让带有参数的block 作为参数,把需要返回的数据,赋值给block的参数,让blcok传递出去就就可以了
     
         4.5 block作为参数的格式怎么写?
              如果不会的话,就把AFN里面的block参数拷过来改一下
     1 - (NSURLSessionDataTask *)GET:(NSString *)URLString
     2                    parameters:(id)parameters
     3                      progress:(void (^)(NSProgress * _Nonnull))downloadProgress
     4                       success:(void (^)(NSURLSessionDataTask * _Nonnull, id _Nullable))success
     5                       failure:(void (^)(NSURLSessionDataTask * _Nullable, NSError * _Nonnull))failure
     6  
     7  
     8 // 异步任务,不要返回数据
     9 + (void)getSizeOfDirectoryPath:(NSString *)directoryPath completion:(void (^)(NSInteger totalSize))completion
    10 {
    11     dispatch_async(dispatch_get_global_queue(0, 0), ^{
    12        // 子线程执行
    13         // 1.获取文件管理者对象
    14         NSFileManager *mgr = [NSFileManager defaultManager];
    15         // 判断传入文件夹路径存在
    16         BOOL isDirectory;
    17         BOOL isExist = [mgr fileExistsAtPath:directoryPath isDirectory:&isDirectory];
    18        
    19         if (!isExist || !isDirectory) {
    20             @throw [NSException exceptionWithName:@"FileError" reason:@"笨蛋,传入的路径可能为空,或者不是文件夹路径,仔细好好检查吧" userInfo:nil];
    21         }
    22         NSInteger totalSize = 0;
    23  
    24         // 2.获取所有文件(传递文件夹路径)
    25         NSArray *subPaths = [mgr subpathsAtPath:directoryPath];
    26         // 3.遍历所有文件
    27         for (NSString *subPath in subPaths) {
    28             // 4.拼接完整文件名
    29             NSString *filePath = [directoryPath stringByAppendingPathComponent:subPath];
    30            
    31             // 判断下是否是隐藏文件
    32             if ([subPath hasPrefix:@".DS"]) continue;
    33             // 是否是文件夹
    34             BOOL isDirectory;
    35             // 判断文件是否存在,并且是否是文件夹
    36             [mgr fileExistsAtPath:filePath isDirectory:&isDirectory];
    37             if (isDirectory) continue;
    38             // 5.attributesOfItemAtPath:传入文件全路径,就能获取文件属性
    39             NSDictionary *attr = [mgr attributesOfItemAtPath:filePath error:nil];
    40             // 6.把文件尺寸累加
    41             totalSize += [attr fileSize];
    42         }
    43         // 一定要记得回到主线程
    44         dispatch_sync(dispatch_get_main_queue(), ^{
    45             if (completion) {
    46           注意:()内可以写这个方法定义的任何值,但要和block的参数类型相同,最后括号内的值会传给Block的参数
    47                 completion(totalSize);       
    48             }
    49         });         
    50     }); 
    51 }
     
  • 相关阅读:
    运筹学 CheatSheet
    东南大学 2021 年夏季赛部分题解
    信号与系统期末复习精要
    信号量的基本同步模式
    OpenMP入门:求pi
    肉眼可见的 Z 变换性质
    操作系统概念 第7章 死锁
    操作系统概念 第10章 文件系统接口
    操作系统概念 第9章 虚拟内存
    操作系统概念 第8章 内存管理
  • 原文地址:https://www.cnblogs.com/xiaotian666/p/5731433.html
Copyright © 2011-2022 走看看