NetworkHandler 0.9.3

NetworkHandler 0.9.3

Michael Redig维护。



  • Michael Redig, Alex Mata, Hector Villasano

Network Handler

NetworkHandler是为了节省您的时间而编写的,它通过去除从URLSession中剪裁掉不必要的麻烦的样板代码。通常,每次您进行网络调用时,都必须检查错误、响应代码、数据存在性和数据有效性。每次。为了...省略这些步骤,在URLSession中使用它们可能会导致意想不到的后果。幸运的是,我们构建了NetworkHandler作为解决方案。

NetworkHandler由3个核心功能组成

  • transferMahOptionalDatas:
    • 有时,您可能想进行网络请求,而无需检查从服务器返回的数据。在这些情况下,您使用transferMahOptionalDatas来严格提供当成功时提供Data?,当失败时提供NetworkError
  • transferMahDatas:
    • 这是在您知道成功的交易会产生合法数据的情况下的。在成功时,您将获得Data,在失败时获得NetworkError
  • transferMahCodableDatas:
    • 这用于处理JSON API的具体用例。您构建您的模型,例如DemoModel,然后只需告诉这个函数这是您想要的特定类型的结果。(transferMahCodableDatas(with: urlRequest, completion: (Result<DemoModel, NetworkError>) -> Void)) 成功时,它将为您处理所有解码并简单提供请求的自定义类型数据! (成功时)当然,在失败时,它将提供一个NetworkError

特性

NetworkHandler减少了您在制作HTTP请求时需要处理的开销代码。NetworkHandler用Swift 5编写,以利用Result类型删除冗余。

您可能想知道它真的可以减少多少样板代码。这里是示例

这两个示例都适用

struct DemoModel: Codable, Equatable {
	let id: UUID
	var title: String
	var subtitle: String
	var imageURL: URL

	init(id: UUID = UUID(), title: String, subtitle: String, imageURL: URL) {
		self.id	= id
		self.title = title
		self.subtitle = subtitle
		self.imageURL = imageURL
	}
}

let baseURL = URL(string: "https://networkhandlertestbase.firebaseio.com/DemoAndTests")!
let getURL = baseURL.appendingPathExtension("json")

使用之前(使用 URLSession.dataTask)

URLSession.shared.dataTask(with: getURL) { (data, response, error) in
	if let response = response as? HTTPURLResponse {
		if response.statusCode != 200 {
			// probably throw an error here
			print("Received a non 200 http response: \(response.statusCode) in \(#file) line: \(#line)")
			return
		}
	} else {
		// probably throw an error here
		print("Did not receive a proper response code in \(#file) line: \(#line)")
		return
	}

	if let error = error {
		print("There was an error fetching your data: \(error)")
		return
	}

	guard let data = data else {
		// again, probably throw an error here if the data doesn't exist
		return
	}

	do {
		let firebaseResults = try JSONDecoder().decode([String: DemoModel].self, from: data)
		let models = Array(firebaseResults.values).sorted { $0.title < $1.title }
		// do something with your successful result!
		print(models)
	} catch {
		let nullData = "null".data(using: .utf8)
		if data == nullData {
			// there was no actual error, Firebase just returns "null" if there is a request it can't provide data for.
			let models = [DemoModel]()
			// do something with your empty array result!
			print(models)
			return
		}
		// there was an error decoding your data
		[print]("Error loading demo models: \(error)")
	}
}.resume() //and I bet you always forget this! (I know do!)

之后(使用 NetworkHandler)

// can only input URLRequests, but an extension is provided for ease of use
let request = getURL.request
NetworkHandler.default.transferMahCodableDatas(with: request) { (result: Result<[String: DemoModel], NetworkError>) in
	do {
		let firebaseResults = try result.get()
		let models = Array(firebaseResults.values).sorted { $0.title < $1.title }
		// do something with your successful result!
		print(models)
	} catch NetworkError.dataWasNull {
		// there was no actual error, Firebase just returns "null" if there is a request it can't provide data for.
		let models = [DemoModel]()
		// do something with your empty array result!
		print(models)
	} catch {
		print("Error loading demo models: \(error)")
	}
}

幕后发生的一切都一样,但每次都键入它没有意义。这些都是模板代码。另外,考虑这种情况:你有一个模型控制器执行网络调用,然后在你的 UI 代码中,你告诉你的模型控制器执行该调用。如果 UI 代码中需要知道该调用的结果,你将不得不再次在你的 UI 代码中展开可选数据、可选错误,甚至可选响应。相比之下,使用 NetworkHandler 你可以直接将结果类型传递给你的 UI 代码,并使用数据或显示错误(与包含的 UIAlertController 扩展一起特别容易)。

等等,还有更多!

还有内置的模拟功能!只需打开它,告诉它你想得到错误还是成功的数据响应(并提供所需内容),设置一个延迟来模拟网络事务,然后运行它。

此外,包括了一些类和类型

  • NetworkCache:

    • NSCache 的包装,使得后续请求超级快速
  • NetworkMockingSession:

    • 超级简单的数据模拟
  • UIAlertController 扩展:

    • 允许您简单地传递一个 Error,然后让警报控制器为您创建用户接触警报
  • URL 扩展:

    • 易于生成 URLRequest
  • HTTPMethods:

    • 枚举包含常见的 HTTP 方法字符串,在您的请求中设置(防止你在字符串类型数据上打字错误)
  • HTTPHeaderKeys:

    • 同样,常见的 HTTP 标头键
  • NetworkError:

    • Swifty 错误以便更容易处理错误
  • NetworkHandler:

    • 这是上述 butter 的面包,这个类帮助处理 URLSession.dataTasks

安装

  1. 下载和安装
    • Carthage
      • 将此行添加到您的 Cartfile,然后按照 Cathage 设置指令继续进行 github "mredig/NetworkHandler"
    • brute force files
      • 或者,您也可以将 NetworkHandler 文件夹中的所有 swift 文件复制到您的项目中,如果您是 masochistic。
    • CocoaPods
      • 将以下行添加到您的Podfile中:pod 'NetworkHandler', '~> 0.9.3'
  2. 导入到您想要使用的任何文件中 import NetworkHandler
  3. 使用它!
待办事项
  • README
    • 作为返回值演示任务和取消
    • 演示模拟数据
  • 为其他平台创建构建目标。
    • tvOS
    • watchOS
  • 可能还需要更多的访问控制修复,但最大的问题已修复
  • 修复网络错误代码片段(```swift)
  • swiftlint遵从性