Skip to content

Instantly share code, notes, and snippets.

@jpotts18
Created November 21, 2014 16:55
Show Gist options
  • Save jpotts18/fa709d6102fa9c1dea30 to your computer and use it in GitHub Desktop.
Save jpotts18/fa709d6102fa9c1dea30 to your computer and use it in GitHub Desktop.
//
// 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