Skip to content

Instantly share code, notes, and snippets.

@mishagray
Created January 14, 2016 05:31
Show Gist options
  • Star 2 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save mishagray/e269ca2e72d723847f4b to your computer and use it in GitHub Desktop.
Save mishagray/e269ca2e72d723847f4b to your computer and use it in GitHub Desktop.
FutureKit+AlamoFire.swift
//
// FutureKit+AlamoFire.swift
//
// Created by Michael Gray on 9/21/15.
//
import Foundation
import Alamofire
import FutureKit
extension Request {
// so AlamoFire uses V as the Value Type and T as the serializer type. Letters gotta match here or swift 2.0 gets superconfused.
func future<T: ResponseSerializerType>(responseSerializer s: T) -> Future<T.SerializedObject> {
let p = Promise<T.SerializedObject>()
p.onRequestCancel { _ in
self.cancel() // AlamoFire will send NSURLErrorDomain,.NSURLErrorCancelled error if cancel is successful
return .Continue // wait for NSError to arrive before canceling future.
}
self.response(queue: nil, responseSerializer: s) { response -> Void in
switch response.result {
case let .Success(t):
p.completeWithSuccess(t)
case let .Failure(error):
let e = error as NSError
if (e.domain == NSURLErrorDomain) && (e.code == NSURLErrorCancelled) {
p.completeWithCancel()
}
else {
p.completeWithFail(error)
}
}
}
return p.future
}
func futureNSData() -> Future<NSData> {
return future(responseSerializer:Request.dataResponseSerializer())
}
// uses NSJSONSerialization
func futureJSONObject(options: NSJSONReadingOptions = .AllowFragments) -> Future<AnyObject> {
return future(responseSerializer:Request.JSONResponseSerializer(options: options))
}
func futureString(encoding: NSStringEncoding? = nil) -> Future<String> {
return future(responseSerializer:Request.stringResponseSerializer(encoding: encoding))
}
func futurePropertyList(options: NSPropertyListReadOptions = []) -> Future<AnyObject> {
return future(responseSerializer:Request.propertyListResponseSerializer(options: options))
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment