如何链接完成?

How to chain completions?

在 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))
        }
    }

使用 NSOperation 和 NSOperationQueue。这使得成功完成一个异步操作成为开始另一个异步操作的先决条件变得容易,依此类推到任何所需的长度和任何所需的配置。

在我看来,您至少有 3 个选择:

  1. Facebook Bolts 框架
  2. 任何 Functional Reactive Programming 框架,例如 RxSwift or ReactiveCocoa
  3. NSOperation

我建议您按此顺序考虑它们:)

FB Bolts 开销最小,恕我直言,最适合像链接操作这样的简单任务。它是用 Objective-C 编写的,但也适用于 Swift.

Functional Reactive Programming 概念很棒,但迫使您再次重新考虑您的应用程序架构并可能进行一些重构。如果这样做,链接操作将变得简单且非常优雅,特别是在 Swift 中。您还会发现许多任务,例如异步操作可以比命令式方式简单得多。

NSOperation 对我来说开销太大了。乍一看它看起来很棒,但是当您开始编码时,您会遇到很多事情崩溃,例如在某些操作之间传递参数或优雅的错误处理。