iOS-手机缓存模型

一:HPCache

一个简单的线程安全且高吞吐量的模型,用于存储简单数据,支持model存储,无需转换。

二:思路

  • 创业一个自定义的DISPATCH_QUEUE_CONCURRENT队列。
  • dispatch_sync(或dispatch_async)用于不修改状态的操作。
  • dispatch_barrier_sync(或dispatch_barrier_async)用于可能修改状态的操作。

注意:这里的属性被标记为nonatomic,因为这里有自定义的代码使用了自定义的队列和屏障来管理线程安全。

三:代码

#import <Foundation/Foundation.h>

@interface HPCache : NSObject

+ (HPCache *)sharedInstance;

- (id)objectForKey:(nonnull id<NSCopying>)key;
- (void)setObject:(id)object forKey:(nonnull id<NSCopying>)Key;
- (void)removeObjectForKey:(nonnull id<NSCopying>)Key;

@end
#import "HPCache.h"

@interface HPCache()

@property (nonatomic, readonly) NSMutableDictionary *cacheObjects;
@property (nonatomic, readonly) dispatch_queue_t queue;

@end

@implementation HPCache

const char *_Nullable kCacheQueueName = "kCacheQueueName";

- (instancetype)init{
    if (self = [super init]) {
        _cacheObjects = [NSMutableDictionary dictionary];
        _queue = dispatch_queue_create(kCacheQueueName, DISPATCH_QUEUE_CONCURRENT);
    }
    return self;
}

+ (HPCache *)sharedInstance{
    static HPCache *instance = nil;
    
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        instance = [[HPCache alloc] init];
    });
    return instance;
}

- (id)objectForKey:(id<NSCopying>)key{
    __block id rv = nil;
    
    dispatch_sync(self.queue, ^{
        rv = [self.cacheObjects objectForKey:key];
    });
    
    return rv;
}

- (void)setObject:(id)object forKey:(id<NSCopying>)Key{
    dispatch_barrier_sync(self.queue, ^{
        [self.cacheObjects setObject:object forKey:Key];
    });
}

- (void)removeObjectForKey:(nonnull id<NSCopying>)Key{
    dispatch_barrier_sync(self.queue, ^{
        [self.cacheObjects removeObjectForKey:Key];
    });
}

@end

附上Demo

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 一:base.h 二:block.h 1. dispatch_block_flags:DISPATCH_BLOCK...
    小暖风阅读 2,479评论 0 0
  • iOS多线程编程 基本知识 1. 进程(process) 进程是指在系统中正在运行的一个应用程序,就是一段程序的执...
    陵无山阅读 6,101评论 1 14
  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 11,135评论 1 32
  • GCD简介 GCD 是 libdispatch 的市场名称,而 libdispatch 作为 Apple 的一个库...
    独木舟的木阅读 1,282评论 0 5
  • 做一行爱一行,是很久以前就认可的话,一直在践行,却没有“真正”做到,对于之前的工作,只在自己的内心里做到了足够的好...
    牧不在阅读 312评论 2 1