Swift – 方法链接
我想在我的swift
代码中实现方法链,可能是Alamofire
方法。 例如,如果我必须使用我的function,如下所示
getListForID(12).Success { // Success block }. Failure { // Failure block }
我如何创建函数getListForID
?
为了扩展@dasblinkenlight和@Sulthan所做的重点 – 这里有一个小例子,说明如何使用您想要的方便语法实现请求函数以成功和失败关闭。
首先,您必须定义一个新类来表示“结果处理程序”。 这就是您的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 }
现在你可以像这样调用它:
doRequest(input).success {result in print("success, with:", result) }.failure { print("fail :(") }
唯一需要注意的是你的doSomethingAsynchronous
函数必须将其完成块调度回主线程,以确保线程安全。
完整项目(增加了使用示例): https : //github.com/hamishknight/Callback-Closure-Chaining
为了理解发生了什么,有助于在没有“方便”语法的情况下重写代码,这使得当闭包是函数的最后一个参数时,可以省略括号:
getListForID(12) .Success( { /* Success block */ } ) .Failure( { /* Failure block */ } )
这使得此API背后的代码结构更加清晰:
-
getListForID
的返回值必须是一个对象 - 该对象必须具有两个名为
Success
andFailure
*的函数 -
Success
和Failure
需要采用闭包类型的单个参数 -
Success
与Failure
需要回归self
*该对象可能只有Success
函数,并返回一个具有单个Failure
函数的不同对象,但是您将无法重新排序Success
和Failure
处理程序,或者完全删除Success
处理程序。