     func _downloadAndCache(url: String, path: String, isOverwrite: Bool, cb: String -> ()) {
         let fileManager = NSFileManager.defaultManager()
         let dir = NSSearchPathForDirectoriesInDomains(.ApplicationSupportDirectory, .UserDomainMask, true).first
-        let file = dir?.stringByAppendingString(NSBundle.mainBundle().bundleIdentifier!).stringByAppendingString(path)
+        let file = dir?.stringByAppendingString("/" + NSBundle.mainBundle().bundleIdentifier! + path)
+        
+        // create Application Support directory if not existed
+        if (fileManager.fileExistsAtPath(dir!)) {
+            do {
+                try fileManager.createDirectoryAtPath(dir!, withIntermediateDirectories: true, attributes: nil)
+            } catch let error as NSError {
+                print(error.localizedDescription)
+            }
+        }
         
         // skip download if file is already existed
         if (fileManager.fileExistsAtPath(file!) && !isOverwrite) {
-            cb("The \(file) is already existed.")
+            cb("'The `\(file!)` is already existed.'")
             return
         }
         

    func _clearCache(path: String, cb: String -> ()) {
        let fileManager = NSFileManager.defaultManager()
        let dir = NSSearchPathForDirectoriesInDomains(.ApplicationSupportDirectory, .UserDomainMask, true).first
        let file = dir?.stringByAppendingString(NSBundle.mainBundle().bundleIdentifier!).stringByAppendingString(path)
    
        do {
            try fileManager.removeItemAtPath(file!)
        } catch let error as NSError {
            print(error.localizedDescription)
        }
        cb("\(file) had been cleared.")
    }
    
    /**

            } catch let error as NSError {
                print(error.localizedDescription)
            }
            cb("'`\(file!)` had been downloaded sucessful.'")
        })
        
        downloadTask.resume()
