街区有一个新的iOS网络库

正如任何iOS开发人员所知,网络是任何移动应用程序的重要组成部分。 当苹果公司在iOS 7中引入URLSession时,社区就敞开了怀抱。 新的API是对旧版URLConnection API的重大改进。 在Bottle Rocket,我们始终在为客户构建应用程序时试图在效率与可维护性之间寻求平衡。 因此,我们通常会直接在URLSession上从头开始编写网络代码。 从可维护性的角度来看,这非常好-使我们的网络代码与Apple的SDK保持同步非常容易。 但是,随着我们的成长,我们意识到经常需要重复编写一些通用的样板化网络代码。 我们决定编写自己的解决方案,而不是使用第三方解决方案(其中许多解决方案非常繁琐)。

我们最近以Apache 2.0许可在GitHub上开源了Hyperspace。 在构建Hyperspace时,我们有一些目标:

  • 减少您需要手工编写的HTTP模板。 这包括定义HTTP方法,状态代码和标头之类的内容。
  • 保持轻巧—开箱即用即可轻松便捷地处理90%的网络用例。 这包括指定您希望从请求中获取的模型类型,以便可以使用Swift 4的Codable协议的魔力自动对其进行解析。
  • 保持简单-我们想让任何人都容易做出贡献。 整个图书馆约为600个SLOC。

将超空间添加到您的项目

将Hyperspace添加到项目中后,您将立即启动并运行。 只需将Hyperspace添加到您的Podfile中(不久将添加对其他依赖项管理器的支持):

 吊舱“超空间” 

定义网络请求

定义请求很简单。 只需创建AnyNetworkRequest的实例并指定您的请求参数:

 让someRequest = 
AnyNetworkRequest (方法:.post,
url:URL(string:“ ...”)!,
标头:[。contentType:.applicationJSON],
正文:postBody)

注意, Model是指您的请求的成功模型响应类型。 这意味着,如果您请求的响应类型符合Decodable ,我们将为您自动处理解码。

还要注意, methodheaders参数依赖于预定义的类型。 不再有容易出现拼写错误的“字符串型” API!

执行网络请求

BackendService的工作就是执行您的网络请求。 只需创建一个BackendService ,然后调用其execute()方法即可:

 让backendService = BackendService()backendService.execute(request:someRequest){(结果)在 
切换结果{
case .success(让responseObject):
//请求成功
案例。失败(让错误):
// 请求失败
}
}

请求完成后,如果请求成功,则将返回包含已解析Model的结果枚举;如果请求失败,则将返回Error 。 很好,因为您不必处理调用程序代码中的可选项。 您也不必处理“不可能”的代码路径,例如同时获取nil结果对象 nil错误,这是我个人对(Data?, URLResponse?, Error?)完成块类型的烦恼之一URLSessiondataTask(withRequest:completionHandler:)

希望这篇文章引起您的兴趣。 开始发出类型安全的网络请求确实很容易,因此,如果您在下一个项目中正在寻找网络解决方案,请尝试Hyperspace。 无论您是否最终使用它,我们都希望您告诉我们您的想法!