如何完成连锁?

时间:2016-02-14 11:28:25

标签: swift grand-central-dispatch completionhandler

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

2 个答案:

答案 0 :(得分:3)

从我的角度来看,你至少有3个选择:

  1. Facebook Bolts框架
  2. 任何Functional Reactive Programming框架,例如RxSwiftReactiveCocoa
  3. NSOperation
  4. 我建议你按照这个顺序考虑它们:)

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

    Functional Reactive Programming概念很棒,但迫使你再次重新考虑你的应用程序架构并做一些重构。如果你这样做,链接操作将很容易,非常优雅,特别是在Swift。您还会发现许多任务,例如异步操作可以更加简单,然后以命令的方式完成。

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

答案 1 :(得分:2)

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