Created
November 21, 2014 16:55
-
-
Save jpotts18/fa709d6102fa9c1dea30 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// | |
// SavedContestFileCache.swift | |
// Pingo | |
// | |
// Created by Jeff Potter on 10/16/14. | |
// Copyright (c) 2014 Byron Mackay. All rights reserved. | |
// | |
import Foundation | |
import Swift | |
class SavedContestFileCache { | |
class func getStorageUrl() -> NSURL { | |
let user = PFUser.currentUser() as PFUser | |
let userId = user.objectId ?? "annonymous" | |
let fileName = "user-\(userId)-contests.json" | |
let documentsPath = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)[0] as NSString | |
let url: NSURL = NSURL(fileURLWithPath: documentsPath.stringByAppendingPathComponent(fileName))! | |
return url | |
} | |
// MARK: Collection methods | |
class func saveAll(contests: [PFContest]) { | |
println("Save --> URL: \(self.getStorageUrl())") | |
var contestArray: [[String: AnyObject]] = []; | |
contestArray.extend(contests.map({ | |
(var contest) -> [String: AnyObject] in | |
return contest.toDictionary() | |
})) | |
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)) { | |
self.writeData(contestArray); | |
} | |
} | |
class func readAll(delegate: SavedFileCacheDelegate){ | |
println("Read --> URL: \(self.getStorageUrl())") | |
var contestArray: [PFContest] = [] | |
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)) { | |
contestArray = self.readData() | |
dispatch_async(dispatch_get_main_queue()) { | |
delegate.myContestsDidLoad!(contestArray) | |
} | |
} | |
} | |
// MARK: Collection Item methods | |
class func delete(contest:PFContest){ | |
self.deleteImages(contest) | |
var contestArray: [PFContest] = [] | |
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)) { | |
contestArray = self.readData() | |
if let index = find(contestArray, contest) { | |
contestArray.removeAtIndex(index) | |
self.saveAll(contestArray) | |
} | |
} | |
} | |
class func findOne(delegate: SavedFileCacheDelegate, contestId: String) { | |
var contestArray: [PFContest] = [] | |
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)) { | |
contestArray = self.readData() | |
var filteredContests = filter(contestArray, { $0.objectId == contestId }) | |
dispatch_async(dispatch_get_main_queue()) { | |
delegate.contestWasFoundById!(filteredContests.count > 0 ? filteredContests[0] : nil) | |
} | |
} | |
} | |
class func saveOrUpdate(contest: PFContest, imageCache:[UIImage?]?) { | |
var contestArray: [PFContest] = [] | |
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)) { | |
self.saveImages(contest, imageCache: imageCache) | |
contestArray = self.readData() | |
if contains(contestArray, contest) { | |
contestArray[find(contestArray, contest)!] = contest | |
} else { | |
contestArray.append(contest) | |
} | |
self.saveAll(contestArray) | |
} | |
} | |
// MARK: File Storage and Retrieval | |
class func readData() -> [PFContest]{ | |
var contestArray: [PFContest] = [] | |
if var data: NSData = NSData(contentsOfURL: self.getStorageUrl()) { | |
if var contests = NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions(0), error: nil) as? [[String: AnyObject]] { | |
contestArray.extend(contests.map { | |
(var dict) -> PFContest in | |
return PFContest.fromDictionary(dict) | |
}) | |
} else { | |
println("Couldn't serialize to NSData") | |
} | |
} else { | |
println("Not contests file found") | |
} | |
return contestArray | |
} | |
class func writeData(contests: [[String: AnyObject]]){ | |
if NSJSONSerialization.isValidJSONObject(contests) { | |
let data = NSJSONSerialization.dataWithJSONObject(contests, options:NSJSONWritingOptions.PrettyPrinted, error: nil)! | |
println("Write <-- URL: \(self.getStorageUrl())") | |
data.writeToURL(self.getStorageUrl(), atomically: true) | |
} else { | |
println("Error -> ContestFile cannot be converted into JSON object") | |
} | |
} | |
// MARK: Save Images to Contest | |
class func saveImages(contest:PFContest, imageCache:[UIImage?]?) { | |
if let cache = imageCache { | |
for var i = 0 ; i < cache.count ; i++ { | |
if let image = cache[i] { | |
let data = UIImagePNGRepresentation(image) | |
let paths = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true) | |
let path = "\(paths[0] as String)/contest-\(contest.objectId)-imageIndex-\(i)" | |
contest.imagesURIs![i] = path | |
NSFileManager.defaultManager().fileExistsAtPath(path) | |
data.writeToFile(path, atomically: false) | |
} | |
} | |
} | |
} | |
class func deleteImages(contest:PFContest) { | |
if let imageURIs = contest.imagesURIs { | |
for uri:String in imageURIs { | |
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)) { | |
let manager = NSFileManager.defaultManager() | |
if manager.fileExistsAtPath(uri) { | |
manager.removeItemAtPath(uri, error: nil) | |
println("deleted ---> Images") | |
} | |
} | |
} | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment