【问题标题】: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))
        }
    }

【问题讨论】:

    标签: swift grand-central-dispatch completionhandler


    【解决方案1】:

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

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

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

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

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 2018-02-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-01-03
        • 2013-03-15
        • 1970-01-01
        • 2023-03-03
        • 2011-09-27
        相关资源
        最近更新 更多