Skip to content

Instantly share code, notes, and snippets.

@keisei1092
Last active December 9, 2016 03:18
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save keisei1092/9f5d792af9ba62eaa1ba3bd2159445aa to your computer and use it in GitHub Desktop.
Save keisei1092/9f5d792af9ba62eaa1ba3bd2159445aa to your computer and use it in GitHub Desktop.

NO Alamofire BUT URLSession

Alamofire、AlamofireObjectMapperおよびAlamofireImageは、依存性を増やしたり、融通がきかなくなるため使いません。
その代わりSwiftビルトインのクラスURLSessionを使います。(参考:

Examples

enum JSONError: String, ErrorType {
    case NoData = "ERROR: no data"
    case ConversionFailed = "ERROR: conversion from JSON failed"
}

// perform request
let urlPath = "http://api.example.com/"
guard let endpoint = URL(string: urlPath) else {
    print("Error creating endpoint")
    return
}
let request = URLRequest(url: endpoint)
URLSession.shared.dataTask(with: request) { data, response, error in
    do {
        guard let data = data else {
            throw JSONError.NoData
        }
        guard let jsonString = String(data: data, encoding: .utf8) else {
            throw JSONError.ConversionFailed
        }
        // ここで何かする
    } catch let error as JSONError {
        print(error.rawValue)
    } catch let error as NSError {
        print(error.debugDescription)
    }
}.resume()

Show an image from remote

(参考:

class ImageLoader {

    var cache = NSCache()

    class var sharedLoader : ImageLoader {
        struct Static {
            static let instance : ImageLoader = ImageLoader()
        }
        return Static.instance
    }

    func imageForUrl(urlString: String, completionHandler:(image: UIImage?, url: String) -> ()) {
        dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), {()in
            var data: NSData? = self.cache.objectForKey(urlString) as? NSData

            if let goodData = data {
                let image = UIImage(data: goodData)
                dispatch_async(dispatch_get_main_queue(), {() in
                    completionHandler(image: image, url: urlString)
                })
                return
            }

            var downloadTask: NSURLSessionDataTask = NSURLSession.sharedSession().dataTaskWithURL(NSURL(string: urlString)!, completionHandler: {(data: NSData!, response: NSURLResponse!, error: NSError!) -> Void in
                if (error != nil) {
                    completionHandler(image: nil, url: urlString)
                    return
                }

                if data != nil {
                    let image = UIImage(data: data)
                    self.cache.setObject(data, forKey: urlString)
                    dispatch_async(dispatch_get_main_queue(), {() in
                        completionHandler(image: image, url: urlString)
                    })
                    return
                }

            })
            downloadTask.resume()
        })

    }
}
ImageLoader.sharedLoader.imageForUrl("http://upload.wikimedia.org/wikipedia/en/4/43/Apple_Swift_Logo.png", completionHandler:{(image: UIImage?, url: String) in
            self.myImage.image = image!
})
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment