与 NSURLSession/NSURLConnection 相比,使用 Alamofire 进行联网有何优势?

what is the advantage of using Alamofire over NSURLSession/NSURLConnection for networking?

任何人都可以帮助我理解这些问题:与 NSURLSession/NSURLConnection 相比,使用 Alamofire 有什么优势?

NSURLSession 和 NSURLConnection 有什么区别?

Alamofire 建立在 NSURLSession 之上,并且使用更少的代码行与 (POST/GET/PUT/etc) 进行 REST 交互。它会给你“90%”的方式,但如果你需要进行超级专业的网络调用,你将需要使用 NSURLSession。

例如:简单的 Alamofire 调用得到 JSON

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

对于 Swift 3.0 及更高版本,Alamofire 是最好的,因为它经过了很好的优化并且可以重复使用,并且它还有许多内置 features.Alamofire 调用类似的方法,通过符合协议 URLRequestConvertible。在底层,Alamofire 调用了一个建立在 NSURLSessionConfiguration 之上的单例模式。

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

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

先回答一下NSURLSession和NSURLConnection的区别

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

  2. NSURLSession: 这里这个案例是在应用委托方法的帮助下处理的

    application:handleEventsForBackgroundURLSession:completionHandler

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

让我们回到您最初的问题,即 Alamofire 相对于默认框架的优势 class,我只是分享我到目前为止所做的经验,所以准备好阅读吧。

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

这背后的原因是我过去使用过第三方库,但在 iOS 的最新更新中并没有很好地结束,假设你有一个付费应用程序并且你的第三方库停止工作那么您客户的应用程序将失去其价值,并最终在应用程序商店中获得负面评论。

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

  1. 更新频率是多少?
  2. 有多少未解决的错误?
  3. 它真的值得使用吗?或者您可以利用框架 classes?
  4. 这个库的许可证是什么?

回到问题上来,我在一个项目中使用了 Alamofire,它刚刚制作了 get,post 和 put 调用具有一些离线同步功能。

现在想想我本可以用 URLSessions 创建自己的 class 并相应地处理响应没有必要使用 Alamofire 因为我在这里没有做任何特别的事情。

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

有一次我使用了一个库来实现我想要的功能,但同样的功能有一个开放的缺陷并且它从未更新过所以我最终制作了我自己的自定义一个并且直到今天它工作正常所以请完成所有打开缺陷部分以避免计划外的意外。

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

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

回到 Objective C 和 NSURLConnection 的时代,像 AFNetworking 这样的库很有意义,但是有了 Swift、Codable 和 URLSession,我认为这种情况就不多了为使用 Alamofire 而制作。