我想在我的swift
代码中实施方法链,可能是Alamofire
方法。例如,如果我必须使用我的函数,如下所示
getListForID(12).Success {
// Success block
}. Failure {
// Failure block
}
我如何创建函数getListForID
?
答案 0 :(得分:7)
要扩展@dasblinkenlight和@Sulthan所取得的重点 - 这里是一个小例子,说明如何通过方便的语法实现请求函数以成功和失败关闭你想要的。
首先,您必须定义一个新类来表示'结果处理程序'。这是您的hhvm
和"scripts":{
"post-install-cmd":[
"hhvm artisan clear-compiled",
"hhvm artisan optimize"
],
"post-update-cmd":[
"hhvm artisan clear-compiled",
"hhvm artisan optimize"
],
"post-create-project-cmd":[
"hhvm --php -r \"copy('.env.example', '.env');\"",
"hhvm artisan key:generate"
]
},
函数将传递的内容,允许您添加多个尾随闭包以构成完成块逻辑。你希望它看起来像这样:
success
这将允许您定义要在完成时执行的多个成功或失败闭包。如果您实际上并不需要多个闭包的容量,那么您可以通过剥离数组来简化类 - 而只是跟踪最后添加的成功和失败完成块。
现在,您所要做的就是定义一个生成新failure
实例的函数,然后执行给定的异步请求,并在完成时调用class ResultHandler {
typealias SuccessClosure = RequestHandler.Output->Void
typealias FailureClosure = Void->Void
// the success and failure callback arrays
private var _successes = [SuccessClosure]()
private var _failures = [FailureClosure]()
/// Invoke all the stored callbacks with a given callback result
func invokeCallbacks(result:RequestHandler.Result) {
switch result {
case .Success(let output): _successes.forEach{$0(output)}
case .Failure: _failures.forEach{$0()}
}
}
// remove all callbacks – could call this from within invokeCallbacks
// depending on the re-usability of the class
func removeAllCallbacks() {
_successes.removeAll()
_failures.removeAll()
}
/// appends a new success callback to the result handler's successes array
func success(closure:SuccessClosure) -> Self {
_successes.append(closure)
return self
}
/// appends a new failure callback to the result handler's failures array
func failure(closure:FailureClosure) -> Self {
_failures.append(closure)
return self
}
}
方法:
ResultHandler
现在你可以这样称呼它:
invokeCallbacks
唯一需要注意的是你的func doRequest(input:Input) -> ResultHandler {
let resultHandler = ResultHandler()
doSomethingAsynchronous(resultHandler.invokeCallbacks)
return resultHandler
}
函数必须将其完成块发送回主线程,以确保线程安全。
完整项目(已添加使用示例):https://github.com/hamishknight/Callback-Closure-Chaining
答案 1 :(得分:6)
为了理解正在发生的事情,在没有"方便性的情况下重写代码会有所帮助。语法,当闭包是函数的最后一个参数时,它允许您省略括号:
getListForID(12)
.Success( { /* Success block */ } )
.Failure( { /* Failure block */ } )
这使得此API背后的代码结构更加清晰:
getListForID
的返回值必须是对象Success
和Failure
* Success
和Failure
都需要采用闭包类型的单个参数Success
和Failure
都需要返回self
* 该对象只能有Success
个函数,并返回一个具有单个Failure
函数的不同对象,但是您将无法重新生成对Success
和Failure
处理程序进行排序,或完全删除Success
处理程序。