如何链接完成?
Posted
技术标签:
【中文标题】如何链接完成?【英文标题】:How to chain completions? 【发布时间】:2016-02-14 11:28:24 【问题描述】:在 Swift 中链接完成的最佳方式是什么?我正在使用从 API 获取一些信息的网络库。要获取我需要的信息:
授权 -> 获取类别列表 -> 获取论坛列表 -> 获取主题列表 ->
嵌套完成看起来很糟糕,有什么方法可以做得更好吗?我尝试使用 dispatch_sync,但没有成功。
示例代码:
api.get_session_key(self.credentials) (sessionKeyResult) -> () in
switch sessionKeyResult
case .Success(let sessionKey):
// STEP 2
self.api.list_categories(self.credentials.userLogin, completion: (surveysResult) -> () in
switch surveysResult
case .Success(let surveys):
// STEP 3 and so on
case .Error(let error): completion(synced: Result.Error(error))
)
case .Error(let error):
completion(synced: Result.Error(error))
【问题讨论】:
【参考方案1】:在我看来,您至少有 3 个选择:
-
Facebook Bolts 框架
任何
Functional Reactive Programming
框架,例如RxSwift 或ReactiveCocoa
NSOperation
我建议您按此顺序考虑它们 :)
FB Bolts
的开销最小,恕我直言,最适合像链接操作这样的简单任务。它是用 Objective-C 编写的,但也适用于 Swift。
Functional Reactive Programming
的概念很棒,但会迫使您再次重新考虑您的应用程序架构并可能进行一些重构。如果你这样做了,链接操作将变得简单而优雅,特别是在 Swift 中。您还会发现许多任务(例如异步操作)可以比命令式方式更简单地完成。
NSOperation
对我来说开销太大。乍一看它看起来很棒,但是当你开始编码时,你会因为很多事情而崩溃,比如在某些操作之间传递参数或优雅的错误处理。
【讨论】:
【参考方案2】:使用 NSOperation 和 NSOperationQueue。这使得成功完成一个异步操作很容易成为启动另一个异步操作的先决条件,依此类推到任何所需的长度和任何所需的配置。
【讨论】:
以上是关于如何链接完成?的主要内容,如果未能解决你的问题,请参考以下文章
如何延迟 onClick 图像链接,以便 .gif 动画可以在页面切换之前完成?