如何链接完成?

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 动画可以在页面切换之前完成?

如何在处理通用链接之前等待 didFinishLaunchingWithOptions 完成?

wpf webBrowser 禁用超链接

带有链接的 JQuery 自动完成

我需要通过一个链接完成两件事

Google云端硬盘文档编辑器显示了其他链接的应用,例如日历和其他Google产品导航。如何隐藏完成的投递箱?