Hi ?
- ? 个人站点:Lab.Lawliet
- ? 技术文档归档
- ? Github
My apps
– | 扫雷Elic 无尽天梯 | 梦见账本 |
---|---|---|
类型 | 游戏 | 财务 |
AppStore | Elic | Umemi |
一、前言
随着Swift越来越成熟,越来越多的项目也开始使用Swift了。很多朋友应该都有遇到和OC混编的情况。
我自己的话,纯Swift和混编的都做过。在爽过纯Swift后,在混编时经常会有被困住手脚的感觉。
尤其这两年的公司项目,很多老代码和必须依赖的基础库都是OC。特别是网络库(基于AFN),又不能不用公司的。
但是在使用过Swift的Moya框架后,对于在混编的Swift中不能写出很Swift的网络请求这件事尤为难受。
于是有了想解决这点痛苦的想法。就有了 SwiftyServiceProtocol
对
Swift
的协议
枚举
泛型
等有一定了解的话会很便于理解
二、封装目标
- 不依赖任何三方网络库
- 便于更换底层网络库(AFN? Alamofire? 自研网络库? 无痛切换。极端一点你甚至可以不同模块使用不同网络库)
- 用起来很Moya很Swifty
- 兼容多模块多域名
- 轻量
- 用于纯Swift项目或者混编项目(不考虑OC调用。原因:单纯的不喜欢)
- 便于模块化处理
三、SwiftyServiceProtocol
源码在此:GitHub_SwiftyServiceProtocol_喜欢的话点个小星星吧⭐️
这个协议十分轻量,不算注释也就12行代码。
3.1 在项目中对 SwiftyServiceProtocol 进行拓展
public protocol MyServiceProtocol: SwiftyServiceProtocol where SwiftyServiceCallBackType == 你的网络库的回调 {
}
extension MyServiceProtocol {
var base: String {
// 如果你的项目只有一个域名,在这里写死就好。
// 如果不同模块有不同的域名,那么在对应的Service中实现这个get就行
// 测试环境生产环境的逻辑也可以放在这里
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实现
}
}
复制代码
3.2 实际使用
这里以用户模块的一些请求为例
定义相关Service
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
// 处理网络回调
}
复制代码
四、总结
这个协议我自己已经在两个混编项目中使用了,如果你也喜欢的话,欢迎来点个小星星⭐️GitHub_SwiftyServiceProtocol
参考:
Moya
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END