pinterest/PINCache

Name: PINCache

Owner: Pinterest

Description: Fast, non-deadlocking parallel object cache for iOS, tvOS and OS X

Created: 2015-02-25 17:42:48.0

Updated: 2018-05-23 03:58:52.0

Pushed: 2018-05-15 20:14:15.0

Homepage:

Size: 11601

Language: Objective-C

GitHub Committers

UserMost Recent Commit# Commits

Other Committers

UserEmailMost Recent Commit# Commits

README

PINCache

CocoaPods Carthage compatible Build status

Fast, non-deadlocking parallel object cache for iOS and OS X.

PINCache is a fork of TMCache re-architected to fix issues with deadlocking caused by heavy use. It is a key/value store designed for persisting temporary objects that are expensive to reproduce, such as downloaded data or the results of slow processing. It is comprised of two self-similar stores, one in memory (PINMemoryCache) and one on disk (PINDiskCache), all backed by GCD and safe to access from multiple threads simultaneously. On iOS, PINMemoryCache will clear itself when the app receives a memory warning or goes into the background. Objects stored in PINDiskCache remain until you trim the cache yourself, either manually or by setting a byte or age limit.

PINCache and PINDiskCache accept any object conforming to NSCoding. Put things in like this:

Objective-C

age *img = [[UIImage alloc] initWithData:data scale:[[UIScreen mainScreen] scale]];
NCache sharedCache] setObject:img forKey:@"image" block:nil]; // returns immediately

Swift

img = UIImage(data: data, scale:UIScreen.main.scale)
ache.shared().setObject(img, forKey: "img")

Get them back out like this:

Objective-C

NCache sharedCache] objectForKeyAsync:@"image" block:^(PINCache *cache, NSString *key, id object) {
UIImage *image = (UIImage *)object;
NSLog(@"image scale: %f", image.scale);

Swift

ache.shared().object(forKey: "image") { (cache, key, object) in
if let image = object as? UIImage {
    print("image scale: %f", image.scale)
}

Both PINMemoryCache and PINDiskCache use locks to protect reads and writes. PINCache coordinates them so that objects added to memory are available immediately to other threads while being written to disk safely in the background. Both caches are public properties of PINCache, so it's easy to manipulate one or the other separately if necessary.

Collections work too. Thanks to the magic of NSKeyedArchiver, objects repeated in a collection only occupy the space of one on disk:

Objective-C

ray *images = @[ image, image, image ];
NCache sharedCache] setObject:images forKey:@"images"];
g(@"3 for the price of 1: %d", [[[PINCache sharedCache] diskCache] byteCount]);

Swift

n Swift, Array, String, and Dictionary are all value types.
images = [image, image, image] as NSArray // Cast to NSArray
ache.shared.setObject(images, forKey: "images")
t("3 for the prices of 1: %d", PINCache.shared.diskCache.byteCount)
Installation
Manually

Download the latest tag and drag the PINCache folder into your Xcode project.

Install the docs by double clicking the .docset file under docs/, or view them online at cocoadocs.org

Git Submodule
git submodule add https://github.com/pinterest/PINCache.git
git submodule update --init
CocoaPods

Add PINCache to your Podfile and run pod install.

Carthage

Add the following line to your Cartfile and run carthage update --platform ios. Then follow this instruction of Carthage to embed the framework.

equirements

NCache__ requires iOS 8.0, tvOS 9.0, watchOS 2.0 or OS X 10.8 and greater.

ontact

rett Moon](mailto:garrett@pinterest.com)

icense

right 2013 Tumblr, Inc.
right 2015 Pinterest, Inc.

nsed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0

ss required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. [See the License](LICENSE.txt) for the specific language governing permissions and limitations under the License.

This work is supported by the National Institutes of Health's National Center for Advancing Translational Sciences, Grant Number U24TR002306. This work is solely the responsibility of the creators and does not necessarily represent the official views of the National Institutes of Health.