Skip to content

Instantly share code, notes, and snippets.

@rayvinly
Created February 5, 2016 07:43
Show Gist options
  • Save rayvinly/36f411e9b980bfcb49e0 to your computer and use it in GitHub Desktop.
Save rayvinly/36f411e9b980bfcb49e0 to your computer and use it in GitHub Desktop.
A simple API to fetch gists on GitHub
//
// GistAPI.swift
// Gists
//
// Created by Raymond Law on 2/5/16.
// Copyright © 2016 Clean Swift. All rights reserved.
//
import Foundation
class GistAPI
{
private let user = "rayvinly"
private var url: NSURL? {
return NSURL(string: "https://api.github.com/users/\(user)/gists")
}
func fetchGists(completionHandler: (gists: [Gist]?, error: ErrorType?) -> Void)
{
let config = NSURLSessionConfiguration.defaultSessionConfiguration()
let session = NSURLSession(configuration: config)
if let url = url {
session.dataTaskWithURL(url) { (data: NSData?, response: NSURLResponse?, error: NSError?) -> Void in
if let error = error {
dispatch_async(dispatch_get_main_queue(), {
completionHandler(gists: nil, error: error)
})
}
if let data = data {
let gists = self.parseGists(data)
dispatch_async(dispatch_get_main_queue(), {
completionHandler(gists: gists, error: nil)
})
}
}.resume()
}
}
private func parseGists(data: NSData) -> [Gist]
{
var gists = [Gist]()
do {
let json = try NSJSONSerialization.JSONObjectWithData(data, options: .AllowFragments)
if let gistsJSON = json as? [[String: AnyObject]] {
for gistJSON in gistsJSON {
let id = gistJSON["id"] as? String
let createdAtString = gistJSON["created_at"] as? String
let createdAtDate = parseCreatedAt(createdAtString)
let user = gistJSON["owner"]?["login"] as? String
let desc = gistJSON["description"] as? String
if let filesJSON = gistJSON["files"] as? [String: NSDictionary] {
for fileJSON in filesJSON.values {
if let rawURL = fileJSON["raw_url"] as? String {
let url = NSURL(string: rawURL)
let gist = Gist(id: id, createdAt: createdAtDate, user: user, desc: desc, url: url, content: nil)
gists.append(gist)
}
}
}
}
}
} catch {
}
return gists
}
private func parseCreatedAt(date: String?) -> NSDate?
{
guard let date = date else { return nil }
let dateFormatter = NSDateFormatter()
dateFormatter.dateFormat = "yyyy'-'MM'-'dd'T'HH':'mm':'ss'Z'"
return dateFormatter.dateFromString(date)
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment