Skip to content

Instantly share code, notes, and snippets.

@taktamur
Created June 29, 2014 07:08
Show Gist options
  • Save taktamur/5f96ce6e89dbdc342842 to your computer and use it in GitHub Desktop.
Save taktamur/5f96ce6e89dbdc342842 to your computer and use it in GitHub Desktop.
Deferredの実装をswiftで書いてみた Playgroundに貼付けて動く
import Cocoa
// http://qiita.com/saiten/items/c2ac4df40ad001179afa
// https://github.com/saiten/STDeferred/blob/master/STDeferred/STDeferred.m
// を参考にした。
class PAMDeferred{
class func deferred()->PAMDeferred{
return PAMDeferred()
}
enum DeferredState:Int{ case Unresolved,Resolved,Rejected}
var _state:DeferredState = .Unresolved
func isResolved()->Bool{
return _state == .Resolved
}
func isRejected()->Bool{
return _state == .Rejected
}
func resolve(resultObject:AnyObject){
if( _state == .Unresolved ){
_state = .Resolved
_fire(resultObject)
}
}
func reject(resultObject:AnyObject){
if( _state == .Unresolved ){
_state = .Rejected
_fire(resultObject)
}
}
var _doneList:Array<(AnyObject)->Void> = []
var _failList:Array<(AnyObject)->Void> = []
var _alwaysList:Array<(AnyObject)->Void> = []
var _resultObject:AnyObject?=nil
func _fire(resultObject:AnyObject){
_resultObject = resultObject
let list:Array = isResolved() ? _doneList : _failList
for block:(AnyObject)->Void in list + _alwaysList{
block(resultObject)
}
}
func then(block:(AnyObject)->Void)->PAMDeferred{
_doneList.append(block)
if( _state == .Resolved ){
block(_resultObject!)
}
return self
}
func fail(block:(AnyObject)->Void)->PAMDeferred{
_failList.append(block)
if( _state == .Rejected ){
block(_resultObject!)
}
return self
}
}
// 処理終わった後に、thenやfailを登録しても動く
let def1 = PAMDeferred()
def1.resolve("resolve")
def1.then({ obj in println("success \(obj)") })
.then({ obj in println("success2 \(obj)") })
.fail({ obj in println("failed \(obj)") })
.fail({ obj in println("failed2 \(obj)") })
// thenやfailを登録した後に処理が終わっても動く
PAMDeferred.deferred()
.then({ obj in println("success \(obj)") })
.then({ obj in println("success2 \(obj)") })
.fail({ obj in println("failed \(obj)") })
.fail({ obj in println("failed2 \(obj)") })
.resolve("resolve")
PAMDeferred.deferred()
.then({ obj in println("success \(obj)") })
.then({ obj in println("success2 \(obj)") })
.fail({ obj in println("failed \(obj)") })
.fail({ obj in println("failed2 \(obj)") })
.reject("reject")
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment