【问题标题】:what is the advantage of using Alamofire over NSURLSession/NSURLConnection for networking?在 NSURLSession/NSURLConnection 上使用 Alamofire 进行网络有什么优势?
【发布时间】:2016-07-28 00:28:12
【问题描述】:

谁能帮助我理解这些问题:使用 Alamofire 优于 NSURLSession/NSURLConnection 有什么优势?

NSURLSession 和 NSURLConnection 有什么区别?

【问题讨论】:

    标签: nsurlconnection alamofire nsurlsession mobile-application


    【解决方案1】:

    优点是有更高层次的抽象,所以你可以写更少的代码行。但是,仍然没有对 Codable 的官方支持。更新 Swift 版本可能有其缺点,但我认为这应该会随着 Swift 5 中的 ABI 稳定性而得到改善。此外,您必须注意安全漏洞。

    回到 Objective C 和 NSURLConnection 时代,AFNetworking 之类的库很有意义,但是有了 Swift、Codable 和 URLSession,我认为使用 Alamofire 的情况就更少了。

    【讨论】:

      【解决方案2】:

      首先我来回答一下NSURLSession和NSURLConnection的区别

      1. NSURLConnection :如果我们与 NSURLConnection 建立了开放连接,假设您关闭了您的应用,那么我们接收或发送的所有内容都会丢失

      2. NSURLSession:这里是借助应用委托方法来处理这种情况的

        application:handleEventsForBackgroundURLSession:completionHandler

      Here's a link 我发现这可能有助于更好地解释两者之间的差异

      让我们回答您最初的问题,即 Alamofire 相对于默认框架类的优势,我只是分享我迄今为止所做的经验,因此请做好准备,因为这是一篇长篇文章。

      对我来说,经验法则永远不会绕过框架,除非你有充分的理由这样做,无论你使用什么技术。

      这背后的原因是我过去曾使用过第三方库,但在最新的 iOS 更新中效果不佳,假设您有付费应用并且您的第三方库停止工作,那么您客户的应用将会丢失它很有价值,最终会在应用商店中出现负值。

      我建议在使用任何第三方库之前,请确保检查给定的问题

      1. 更新频率是多少?
      2. 打开了多少个未解决的错误?
      3. 真的值得使用还是可以利用框架类?
      4. 这个库的许可证是什么?

      回到这个问题,我在一个项目中使用了 Alamofire,它只是让 get、post 和 put 调用具有一些离线同步功能。

      现在考虑一下,我可以使用 URLSessions 创建自己的类并相应地处理响应,因此无需使用 Alamofire,因为我在这里没有做任何特别的事情。

      我相信这一切都可以通过默认框架实现,而不是使用第三方,但我还是使用了它。我为什么要使用它不知道也许我很好奇,但在这里学到的一个教训是我可以通过使用框架类来实现同样的事情,如果假设库停止工作,我将不知道它为什么会这样做并且会必须依赖该库的管理员/作者的修复,这可能需要一个月、一周、一天的时间,谁知道呢

      一旦我为我想要的功能使用了一个库,但同样的功能有一个开放的缺陷并且它从未更新,所以我最终制作了我自己的自定义一个,直到今天它工作正常,所以一定要检查所有开放的缺陷部分,以避免意外的意外。

      同样如上述答案中所述,仅当您遇到默认框架的限制时才使用第三方组件,甚至在您这样做之前,请检查该库的最后一次更新时间、它拥有什么许可证以及如何更新存在许多未解决的缺陷。

      【讨论】:

        【解决方案3】:

        NSURLConnection 是 Apple 用于网络的旧 API(例如发出 HTTP 请求和接收响应),而 NSURLSession 是他们的新 API。后者级别更高,通常更容易,并且涉及的样板代码更少,可供大多数应用程序开发人员使用 - 基本上没有理由使用前者,除非在您不想更新的遗留代码中。

        一点历史:在 NSURLSession 出现之前,第三方库 AFNetworking 成为了在 Objective C 中进行网络的事实上的标准,因为它提供了比 NSURLConnection(它是一个包装器)更简单、更方便的 API - 我认为这些天它包装了 NSURLSession )。同一位开发人员后来为 Swift 制作了一个类似的库,称为 AlamoFire,以便充分利用“Swift 的做事方式”(而不仅仅是将 Swift 绑定添加到 AFNetworking)。大约在同一时间 NSURLSession 出现了,很明显 Apple 受到了 AFNetworking 的启发,并希望使他们的新网络 API 使用起来同样方便——总的来说,我认为他们成功了。这意味着,虽然以前,使用 AFNetworking 而不是 NSURLConnection 是大多数开发人员唯一明智的选择,但今天使用 AFNetworking 或 AlamoFire 优于 NSURLSession 的优势要小得多,对于大多数开发新项目的开发人员,我建议只从使用 NSURLSession 开始,如果他们觉得遇到了一些足够大到足以证明添加另一个依赖项的限制或不便,则只查看 AlamoFire。

        【讨论】:

          【解决方案4】:

          对于 Swift 3.0 及更高版本,Alamofire 是最好的,因为它经过了很好的优化并且可重用,并且它还具有许多内置功能。Alamofire 需要一种类似的方法,即通过符合协议 URLRequestConvertible 创建路由器。在底层,Alamofire 需要一个建立在 NSURLSessionConfiguration 之上的单例模式。

          【讨论】:

          • 现在 swift4.0 有了新的使用 Codable 的 json 解析。所以在这里,Alamofire 变得过时且冗长。取而代之的是 pod 'CodableAlamofire' 作为替代品。您可以查看以下提到的网址:github.com/Otbivnoe/CodableAlamofire
          【解决方案5】:

          Alamofire 建立在 NSURLSession 之上,与 (POST/GET/PUT/etc) 进行 REST 交互的代码行数更少。它将为您提供“90%”的方法,但如果您需要进行超级专业的网络调用,则需要使用 NSURLSession。

          例如:获取 JSON 的简单 Alamofire 调用

          Alamofire.request(.GET, "https://www.google.com/",encoding: .JSON).responseJSON {response in
                  if(response.result.error == nil){
                      print(response.data)
                  }else{
                      print("Network Error")
                  }
          }
          

          NSURLConnection 现已弃用,NSURLSession 是新标准。 https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/URLLoadingSystem/Articles/UsingNSURLSession.html

          【讨论】:

          • 我实际上更喜欢这个答案,因为它直接解决了 OP 的问题。但是,我想补充一下关于 Swift 中 Codable 的可用性以及此响应是否仍然适用的一些内容。
          猜你喜欢
          • 1970-01-01
          • 2014-05-19
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-04-08
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多