美文网首页iOS相关iOS,object-c和swift开发iOS进阶指南
ios分离dataSource和delegate以及清除文件缓存

ios分离dataSource和delegate以及清除文件缓存

作者: Hither | 来源:发表于2016-06-16 20:31 被阅读630次

    在以往开发中,一旦我们的项目很大,往往我们ViewController中的代码会超过1000行,维护起来相当的不方便,为此我将其中的一个空间UITableView的数据源和代理从ViewController中分离出来,这样ViewController中的代码明显就减少了一大半,而且更便于我进行维护。

    先来看看整个项目的结构(本次第一个重点是红色方框里的):

    分离dataSource

    TableViewDataSource.h:
    #import <Foundation/Foundation.h>
    #import <UIKit/UIKit.h>
    @interface TableViewDataSource : NSObject<UITableViewDataSource>
    @property (nonatomic,strong) NSArray *array;
    @end
    
    TableViewDataSource.m:
    #import "TableViewDataSource.h"
    #import "NewsTableViewCell.h"
    
    @implementation TableViewDataSource
    
    - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
    {
        return _array.count;
    }
    
    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
    {
         NewsTableViewCell*cell = [tableView dequeueReusableCellWithIdentifier:@"NewsCell"];
        if (cell == nil) {
            cell = [[NewsTableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"NewsCell"];
        }
        [cell setModelWithData:_array[indexPath.row]];
        return cell;
    }
    @end
    

    分离delegate

    TableViewDelegate.h:
    #import <Foundation/Foundation.h>
    #import <UIKit/UIKit.h>
    typedef void(^CellSelectedBlock)(id obj);
    @interface TableViewDelegate : NSObject<UITableViewDelegate>
    @property (strong,nonatomic) NSArray *array;
    @property (strong,nonatomic) CellSelectedBlock cellSelectedBlock;
    @end
    
    TableViewDelegate.m:
    #import "TableViewDelegate.h"
    
    @implementation TableViewDelegate
    - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
    {
        _cellSelectedBlock(indexPath);
    }
    
    @end
    
    

    使用dataSource和delegate

    (1)将两者申明为全局变量
    @property (strong,nonatomic)TableViewDataSource *tableViewDataSource;
    @property (strong,nonatomic)TableViewDelegate *tableViewDelegate;
     (2)初始化并将其赋值给tableView的dataSource和delegate
    _tableViewDataSource=[[TableViewDataSource alloc] init];
    _tableViewDelegate=[[TableViewDelegate alloc] init];
    _dataTableView.dataSource=_tableViewDataSource;
    _dataTableView.delegate=_tableViewDelegate;
    
    

    这里有一个难点:我是将delegate下载一个对象中的,所以我使用了block的方式进行页面间的跳转

    上面的cellSelectedBlock就是我申明的block。
    看看这个block怎么使用的:
           WS
             _tableViewDelegate.cellSelectedBlock = ^(id obj){
                SS
                    [strongSelf cellSelectedWithObj:(id)obj];//这是一个方法
                    };
    
    提供一个方法:点击了单元格以后可以进行页面间的跳转。
    - (void)cellSelectedWithObj:(id)obj
    {
        NSIndexPath *indexPath = obj;
        WebViewController*webVC = [WebViewController new];
        WXNewsList*wxNewsList = _totalSource[indexPath.row];
        webVC.url = wxNewsList.url;
        [self.navigationController pushViewController:webVC animated:YES];
    }
    
    

    下面是本文的另外一个重点:清除缓存

    HJTClearCacheTool.h中:
    #import <Foundation/Foundation.h>
    
    @interface HJTClearCacheTool : NSObject
    /**
     *  清理缓存
     */
    +(void)cleanCache:(cleanCacheBlock)block;
    /**
     *  整个缓存目录的大小
     */
    +(float)folderSizeAtPath;
    @end
    
    HJTClearCacheTool.m中:
    #import "HJTClearCacheTool.h"
    
    #define fileManager [NSFileManager defaultManager]
    
    @implementation HJTClearCacheTool
    /**
     *  清理缓存
     */
    +(void)cleanCache:(cleanCacheBlock)block
    {
        dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
            //文件路径
            NSString *directoryPath=[NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) firstObject];
            
            NSArray *subpaths = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:directoryPath error:nil];
            
            for (NSString *subPath in subpaths) {
                NSString *filePath = [directoryPath stringByAppendingPathComponent:subPath];
                [[NSFileManager defaultManager] removeItemAtPath:filePath error:nil];
            }
            //返回主线程
            dispatch_async(dispatch_get_main_queue(), ^{
                block();
            });
        });
        
    }
    /**
     *  计算整个目录大小
     */
    +(float)folderSizeAtPath
    {
        NSString *folderPath=[NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) firstObject];
        
        NSFileManager * manager=[NSFileManager defaultManager ];
        if (![manager fileExistsAtPath :folderPath]) {
            return 0 ;
        }
        NSEnumerator *childFilesEnumerator = [[manager subpathsAtPath :folderPath] objectEnumerator ];
        NSString * fileName;
        long long folderSize = 0 ;
        while ((fileName = [childFilesEnumerator nextObject ]) != nil ){
            NSString * fileAbsolutePath = [folderPath stringByAppendingPathComponent :fileName];
            folderSize += [ self fileSizeAtPath :fileAbsolutePath];
        }
        
        return folderSize/( 1024.0 * 1024.0 );
    }
    /**
     *  计算单个文件大小
     */
    +(long long)fileSizeAtPath:(NSString *)filePath{
        
        NSFileManager *manager = [NSFileManager defaultManager];
        
        if ([manager fileExistsAtPath :filePath]){
            
            return [[manager attributesOfItemAtPath :filePath error : nil ] fileSize];
        }
        return 0 ;
        
    }
    
    @end
    
    
    在需要清楚缓存的地方这样调用就可以了:
    (1)float fileSize = [HJTClearCacheTool folderSizeAtPath];
    (2) //清楚缓存
            [HJTClearCacheTool cleanCache:^{
                [SVProgressHUD showSuccessWithStatus:@"清除成功"];
            }];
    

    更多具体的细节可以直接下载我的Demo来看 https://github.com/hejintaochenxin/Banana

    相关文章

      网友评论

      • LennonLin:每一个UITableView都分离出去了吗?还是说模型指定为id,可以在基础的cell上绑定,继承的随便写就可以?
        Hither:@LennonLin 都是统一继承delegate datasource
      • Thebloodelves:我试过,但是逻辑复杂的页面分离了代码很混乱
        Hither:@Thebloodelves 我记得有篇文章。 写的很好。找到了发给你
      • 某非著名程序员:一直把tableview放在view层,controller层还是比较清晰。数据和代理放一起就好了,要不然造成类特别多,项目大时编译很慢。
      • 羊驼先生丶:表哥。带我飞
        Hither:@AZLIn 一起飞。 随时联系
      • 笨鸟后飞了:可以这样搞一下,viewContrller 这下又清晰了
        Hither:@海东 是的。分离以后。看着舒服又好维护

      本文标题:ios分离dataSource和delegate以及清除文件缓存

      本文链接:https://www.haomeiwen.com/subject/fewmdttx.html