From b4fed4f12120d377ede1c4e2d9beda32eb54f579 Mon Sep 17 00:00:00 2001 From: Alexander Schuch Date: Sat, 31 Jan 2015 01:33:08 +0100 Subject: [PATCH] Rename cache class --- .../{AwesomeCache.swift => Cache.swift} | 20 ++++++------ ...omeCacheObject.swift => CacheObject.swift} | 2 +- AwesomeCacheTests/AwesomeCacheTests.swift | 4 +-- Example.xcodeproj/project.pbxproj | 20 ++++++------ README.md | 31 ++++++++++++++++--- 5 files changed, 49 insertions(+), 28 deletions(-) rename AwesomeCache/{AwesomeCache.swift => Cache.swift} (91%) rename AwesomeCache/{AwesomeCacheObject.swift => CacheObject.swift} (96%) diff --git a/AwesomeCache/AwesomeCache.swift b/AwesomeCache/Cache.swift similarity index 91% rename from AwesomeCache/AwesomeCache.swift rename to AwesomeCache/Cache.swift index 5647474..bb6e4b2 100644 --- a/AwesomeCache/AwesomeCache.swift +++ b/AwesomeCache/Cache.swift @@ -11,7 +11,7 @@ import Foundation /** * Represents the expiry of a cached object */ -public enum AwesomeCacheExpiry { +public enum CacheExpiry { case Never case Seconds(NSTimeInterval) case Date(NSDate) @@ -25,7 +25,7 @@ public enum AwesomeCacheExpiry { * Subclassing notes: This class fully supports subclassing. * The easiest way to implement a subclass is to override `objectForKey` and `setObject:forKey:expires:`, e.g. to modify values prior to reading/writing to the cache. */ -public class AwesomeCache { +public class Cache { public let name: String public let cacheDirectory: String @@ -90,11 +90,11 @@ public class AwesomeCache { * If the error block is called, the object is not cached and the completion block is invoked with this error. * @param completion Called as soon as a cached object is available to use. The second parameter is true if the object was already cached. */ - public func setObjectForKey(key: String, cacheBlock: ((T, AwesomeCacheExpiry) -> (), (NSError?) -> ()) -> (), completion: (T?, Bool, NSError?) -> ()) { + public func setObjectForKey(key: String, cacheBlock: ((T, CacheExpiry) -> (), (NSError?) -> ()) -> (), completion: (T?, Bool, NSError?) -> ()) { if let object = objectForKey(key) { completion(object, true, nil) } else { - let successBlock: (T, AwesomeCacheExpiry) -> () = { (obj, expires) in + let successBlock: (T, CacheExpiry) -> () = { (obj, expires) in self.setObject(obj, forKey: key, expires: expires) completion(obj, false, nil) } @@ -118,17 +118,17 @@ public class AwesomeCache { * @return The cached object for the given name, or nil */ public func objectForKey(key: String) -> T? { - var possibleObject: AwesomeCacheObject? + var possibleObject: CacheObject? // Check if object exists in local cache - possibleObject = cache.objectForKey(key) as? AwesomeCacheObject + possibleObject = cache.objectForKey(key) as? CacheObject if possibleObject == nil { // Try to load object from disk (synchronously) dispatch_sync(diskQueue) { let path = self.pathForKey(key) if self.fileManager.fileExistsAtPath(path) { - possibleObject = NSKeyedUnarchiver.unarchiveObjectWithFile(path) as? AwesomeCacheObject + possibleObject = NSKeyedUnarchiver.unarchiveObjectWithFile(path) as? CacheObject } } } @@ -166,9 +166,9 @@ public class AwesomeCache { * @param object The object that should be cached * @param forKey A key that represents this object in the cache */ - public func setObject(object: T, forKey key: String, expires: AwesomeCacheExpiry) { + public func setObject(object: T, forKey key: String, expires: CacheExpiry) { let expiryDate = expiryDateForCacheExpiry(expires) - let cacheObject = AwesomeCacheObject(value: object, expiryDate: expiryDate) + let cacheObject = CacheObject(value: object, expiryDate: expiryDate) // Set object in local cache cache.setObject(cacheObject, forKey: key) @@ -255,7 +255,7 @@ public class AwesomeCache { return cacheDirectory.stringByAppendingPathComponent(key).stringByAppendingPathExtension("cache")! } - private func expiryDateForCacheExpiry(expiry: AwesomeCacheExpiry) -> NSDate { + private func expiryDateForCacheExpiry(expiry: CacheExpiry) -> NSDate { switch expiry { case .Never: return NSDate.distantFuture() as NSDate diff --git a/AwesomeCache/AwesomeCacheObject.swift b/AwesomeCache/CacheObject.swift similarity index 96% rename from AwesomeCache/AwesomeCacheObject.swift rename to AwesomeCache/CacheObject.swift index e9ed413..89be647 100644 --- a/AwesomeCache/AwesomeCacheObject.swift +++ b/AwesomeCache/CacheObject.swift @@ -14,7 +14,7 @@ import Foundation * NOTE: It is currently not possible to use generics with a subclass of NSObject * However, NSKeyedArchiver needs a concrete subclass of NSObject to work correctly */ -class AwesomeCacheObject : NSObject, NSCoding { +class CacheObject : NSObject, NSCoding { let value: AnyObject let expiryDate: NSDate diff --git a/AwesomeCacheTests/AwesomeCacheTests.swift b/AwesomeCacheTests/AwesomeCacheTests.swift index 00b29ea..c00c6c5 100644 --- a/AwesomeCacheTests/AwesomeCacheTests.swift +++ b/AwesomeCacheTests/AwesomeCacheTests.swift @@ -12,10 +12,10 @@ import AwesomeCache class AwesomeCacheTests: XCTestCase { - var cache: AwesomeCache = AwesomeCache(name: "awesomeCache") + var cache: Cache = Cache(name: "awesomeCache") override func setUp() { - cache = AwesomeCache(name: "awesomeCache") + cache = Cache(name: "awesomeCache") cache.removeAllObjects() super.setUp() diff --git a/Example.xcodeproj/project.pbxproj b/Example.xcodeproj/project.pbxproj index 3b3cf37..8e6e141 100644 --- a/Example.xcodeproj/project.pbxproj +++ b/Example.xcodeproj/project.pbxproj @@ -17,8 +17,8 @@ 4DC91FAC1A7C54B200C81E10 /* AwesomeCacheTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4DC91FAB1A7C54B200C81E10 /* AwesomeCacheTests.swift */; }; 4DC91FAF1A7C54B200C81E10 /* AwesomeCache.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4DC91F981A7C54B200C81E10 /* AwesomeCache.framework */; }; 4DC91FB01A7C54B200C81E10 /* AwesomeCache.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 4DC91F981A7C54B200C81E10 /* AwesomeCache.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; - 4DC91FBA1A7C552900C81E10 /* AwesomeCache.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4DC91FB81A7C552900C81E10 /* AwesomeCache.swift */; }; - 4DC91FBB1A7C552900C81E10 /* AwesomeCacheObject.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4DC91FB91A7C552900C81E10 /* AwesomeCacheObject.swift */; }; + 4DC91FBA1A7C552900C81E10 /* Cache.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4DC91FB81A7C552900C81E10 /* Cache.swift */; }; + 4DC91FBB1A7C552900C81E10 /* CacheObject.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4DC91FB91A7C552900C81E10 /* CacheObject.swift */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -73,8 +73,8 @@ 4DC91FA21A7C54B200C81E10 /* AwesomeCacheTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = AwesomeCacheTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 4DC91FAA1A7C54B200C81E10 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 4DC91FAB1A7C54B200C81E10 /* AwesomeCacheTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AwesomeCacheTests.swift; sourceTree = ""; }; - 4DC91FB81A7C552900C81E10 /* AwesomeCache.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AwesomeCache.swift; sourceTree = ""; }; - 4DC91FB91A7C552900C81E10 /* AwesomeCacheObject.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AwesomeCacheObject.swift; sourceTree = ""; }; + 4DC91FB81A7C552900C81E10 /* Cache.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Cache.swift; sourceTree = ""; }; + 4DC91FB91A7C552900C81E10 /* CacheObject.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CacheObject.swift; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -148,8 +148,8 @@ 4DC91F991A7C54B200C81E10 /* AwesomeCache */ = { isa = PBXGroup; children = ( - 4DC91FB81A7C552900C81E10 /* AwesomeCache.swift */, - 4DC91FB91A7C552900C81E10 /* AwesomeCacheObject.swift */, + 4DC91FB81A7C552900C81E10 /* Cache.swift */, + 4DC91FB91A7C552900C81E10 /* CacheObject.swift */, 4DC91F9C1A7C54B200C81E10 /* AwesomeCache.h */, 4DC91F9A1A7C54B200C81E10 /* Supporting Files */, ); @@ -333,8 +333,8 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 4DC91FBA1A7C552900C81E10 /* AwesomeCache.swift in Sources */, - 4DC91FBB1A7C552900C81E10 /* AwesomeCacheObject.swift in Sources */, + 4DC91FBA1A7C552900C81E10 /* Cache.swift in Sources */, + 4DC91FBB1A7C552900C81E10 /* CacheObject.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -420,7 +420,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; + IPHONEOS_DEPLOYMENT_TARGET = 8.1; MTL_ENABLE_DEBUG_INFO = YES; ONLY_ACTIVE_ARCH = YES; SDKROOT = iphoneos; @@ -456,7 +456,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; + IPHONEOS_DEPLOYMENT_TARGET = 8.1; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; VALIDATE_PRODUCT = YES; diff --git a/README.md b/README.md index 6a46a46..ef2bd36 100644 --- a/README.md +++ b/README.md @@ -7,7 +7,7 @@ Backed by NSCache for maximum performance and support for expiry of single objec ## Usage ```swift -let cache = AwesomeCache(name: "awesomeCache") +let cache = Cache(name: "awesomeCache") cache["name"] = "Alex" let name = cache["name"] @@ -57,19 +57,40 @@ The completion block is invoked as soon as the cacheBlock is finished and the ob ## Installation -pod "AwesomeCache", "~> 0.2" +#### Carthage -For now, just drag and drop the two classes in the `Source` folder into your project. +Add the following line to your [Cartfile](https://github.com/Carthage/Carthage/blob/master/Documentation/Artifacts.md#cartfile). +``` +github "aschuch/AwesomeCache" +``` + +Then run `carthage update`. + +#### Cocoapods + +**NOTE:** Cocoapods does not officially support Swift projects yet. Make sure you have Cocoapods 0.36 beta installed by running `gem install cocoapods --pre`. + +Add the following line to your Podfile. + +``` +pod "AwesomeCache", "~> 1.0" +``` + +Then run `pod install` with Cocoapods 0.36 or newer. + +#### Manually + +Just drag and drop the two `.swift` files in the `AwesomeCache` folder into your project. ## Tests Open the Xcode project and press `⌘-U` to run the tests. -Alternatively, all tests can be run in the terminal using [xctool](https://github.com/facebook/xctool) (once it is ready for Xcode 6). +Alternatively, all tests can be run in the terminal using [xctool](https://github.com/facebook/xctool). ```bash -xctool -scheme Tests -sdk iphonesimulator test +xctool -scheme AwesomeCacheTests -sdk iphonesimulator test ``` ## Contributing