iOS中的轻量级持久性不应该那么难

简介Shallows —可重用,易于使用的缓存库

我认为您会同意,有时候在iOS中,本来应该很容易的事情变得很困难。 好吧, 不难 ,但是麻烦,不直观,而且绝对没有乐趣。

良好的例子之一是轻量级的持久性。 也许您想在磁盘上保存少量用户数据。 或缓存一些来自网络的信息。 甚至存储图像。 您知道这些事情很容易实现,但您却并非如此。

因为这些事情很棘手。 您将要编写很多代码( LightweightPersistenceManager ,还有其他人吗?),并且有很多事情您可能做错了,而且您的解决方案可能不会那么好或不能重复使用。

那不是你的错

只是在iOS上,轻量级持久性没有自己的抽象级别。 系统解决方案缺乏统一性,灵活性,并且往往向我们公开许多实现细节,有时会使依赖于此的代码不可测试。

Shallows的目标是提供缺少的抽象级别。

首先,这是GitHub存储库的链接:

德雷蒙德/浅滩
浅浅–🛶您的轻量级缓存工具箱 github.com

现在让我们开始吧。

抽象

认识Storage -在Shallows的轻量级持久性世界中,您的主要朋友。

Storage实例是完全抽象的-除键和值的类型外,它们不公开任何实现细节。 存储器可以执行“获取”和“设置”操作,这些操作都是易错且异步的。 让我们看看它们:

  storage.retrieve(forKey:“ batman”){(结果)在 
切换结果{
case .success(让值):
//用值做某事
案例。失败(让错误):
//处理错误
}
}
  storage.set(gordonImage,forKey:“ gordon”){(结果)在 
如果result.isSuccess {
//成功设置
}
}

我们如何获得一个Storage实例? Storage对象是经过类型擦除的,它们实际上不包含任何逻辑。 但是Shallows提供了以下存储:

  1. MemoryStorage
  2. NSCacheStorage
  3. DiskStorage ,它是一个Storage

最后一个可能是最有趣的。 实际上,这是我们的轻量级存储解决方案。 制作一个简单的任务:

 让diskStorage = DiskStorage.folder(“ json-cache”,位于:.cachesDirectory) 

但这只是具有Data价值的存储,为什么对我们来说很有趣? 因为关于Storage的最酷的事情是它的表示形式可以按照您需要的方式进行转换。 因此,例如,我们可以创建一个JSON对象存储:

  let jsonStorage = diskStorage.mapJSONDictionary()// Storage  

或使用Swift 4 Codable的魔力:

  struct Mail:可编码{ 
让文字:字符串
让地址:字符串
}
  let mailDiskStorage = diskStorage.mapJSONObject(Mail.self)//存储 

.mapJSONDictionary.mapJSONObject是具有Data值的存储对象的扩展(以及.mapJSONObject一些扩展),但是我们也可以执行自定义转换。 例如,让我们创建一个磁盘映像缓存:

 让diskStorage = DiskStorage.folder(“ image-cache”,在:.cachesDirectory) 
 让imagesCache = diskStorage.mapValues(transformIn:{尝试UIImage(data:$ 0).unwrap()},transformOut:{尝试UIImageJPEGRepresentation($ 0,1.0).unwrap()})// Storage  

现在我们有了一个功能完备的磁盘图像缓存。 您是否注意到那是多么简单而又透明? 您可以控制一切-您确切地知道图像的存储位置以及存储方式,但是那样简单。 实际上,让我们提取对扩展的转换,以便可以重用它:

 扩展StorageProtocol,其中Value == Data { 

func mapImages()-> Storage {
返回self.mapValues(transformIn:{尝试UIImage(data:$ 0).unwrap()},transformOut:{尝试UIImageJPEGRepresentation($ 0,1.0).unwrap()})
}

}

现在,我们有一个非常简单的设置:

  let imagesCache = DiskStorage.folder(“ image-cache”,在:.cachesDirectory).mapImages() 

就是这样! 现在,只需一行代码,我们就可以在程序中的任何地方创建基于磁盘的图像缓存。 最后,我们得到一个Storage实例—完全抽象。

下一步

尽管Shallows是一个非常紧凑的库,但它具有许多强大的功能。 最好的存储组合之一

我们上面创建的图像缓存不是最高效的缓存,因为每次我们请求图像时都会缓存到磁盘上。 那么将已检索的图像缓存到内存中不是很好吗? Shallows提供了以下几行代码来提供这种逻辑,这可能是自己实现的噩梦:

 让memoryCache = MemoryStorage () 
让combinedCache = memoryCache.combined(与:imagesCache)

因此,现在我们有了两层(内存和磁盘)图像缓存。 同样,您可以完全控制图层的交互方式。 许多缓存库对您隐藏了这些内容–它们使您完全不了解它的工作方式,文件放置位置等。 但是Shallows可以让您清楚地表达自己的逻辑,同时仍然非常易于使用。