Comment on page
21.Swift轻量级网络封装:SwiftyServiceProtocol(适用于混编或纯Swift项目)
随着Swift越来越成熟,越来越多的项目也开始使用Swift了。很多朋友应该都有遇到和OC混编的情况。
我自己的话,纯Swift和混编的都做过。在爽过纯Swift后,在混编时经常会有被困住手脚的感觉。
尤其这两年的公司项目,很多老代码和必须依赖的基础库都是OC。特别是网络库(基于AFN),又不能不用公司的。
于是有了想解决这点痛苦的想法。就有了
SwiftyServiceProtocol
对Swift
的协议
枚举
泛型
等有一定了解的话会很便于理解
- 1.不依赖任何三方网络库
- 2.便于更换底层网络库(AFN? Alamofire? 自研网络库? 无痛切换。极端一点你甚至可以不同模块使用不同网络库)
- 3.用起来很Moya很Swifty
- 4.兼容多模块多域名
- 5.轻量
- 6.用于纯Swift项目或者混编项目(不考虑OC调用。原因:单纯的不喜欢)
- 7.便于模块化处理
这个协议十分轻量,不算注释也就12行代码。
public protocol MyServiceProtocol: SwiftyServiceProtocol where SwiftyServiceCallBackType == 你的网络库的回调 {
}
extension MyServiceProtocol {
/// 如果你的项目只有一个域名,在这里写死就好。如果不同模块有不同的域名,那么在对应的Service中实现这个get就行,测试环境生产环境的逻辑也可以放在这里
var base: String {
return "你的域名"
}
var urlString: String {
return base + "/" + path
}
func request(completion: SwiftyServiceCallBackType?) {
switch method {
case .GET:
get(completion: completion)
case .POST:
post(completion: completion)
}
}
// MARK: - Private
private func post(completion: 你的网络库的回调?) {
// 你的POST实现
}
private func get(completion: 你的网络库的回调?) {
// 你的GET实现
}
}
这里以用户模块的一些请求为例
enum YourUserService { // 定义你需要的接口
/// 获取用户信息
case Info(uid: Int64)
/// 关注某人
case Follow(uid: Int64)
/// 取消关注某人
case UnFollow(uid: Int64)
}
extension YourUserService: MyServiceProtocol {
// var base: String {
// return "如果这个模块有不同模块有不同的域名,在这里实现这个get就行"
// }
/// 接口参数
var parameters: [AnyHashable : Any]? {
switch self {
case let .Info(uid):
return ["uid" : uid]
case .Follow(let uid):
return ["id" : uid]
case .UnFollow(let uid):
return ["id" : uid]
}
}
/// 接口路径
var path: String {
switch self {
case .Info:
return "info的path"
case .Follow:
return "follow的path"
case .UnFollow:
return "unfollow的path"
}
}
/// 请求方法选择
var method: SwiftyServiceMethod {
switch self {
case .Info:
return .GET
default:
return .POST
}
}
}
UserService
.Info(yourUser.uid)
.request { (response) in
// 处理网络回调
}
Last modified 2yr ago