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