前言:仔細(xì)看了又看CTMediator的Demo,在這個過程中突然想到了Moya沫换。所以我下面介紹的將基于Moya的思想的封裝鼎天。
1. 新建一個協(xié)議:內(nèi)部包含CTMediator的所需參數(shù)水慨。如下:
// 使用方式:創(chuàng)建枚舉, 遵守該協(xié)議载绿,根據(jù)不同case設(shè)置下列參數(shù)的值
public protocol SPTargetType {
/// 參數(shù)
var commonParams: [String: Any] { get }
/// 組件名稱
var moudle: String { get }
/// 響應(yīng)者名稱
var target: String { get }
/// 方法名稱
var action: String { get }
/// 是否緩存
var shouldCacheTarget: Bool { get }
}
2. 稍微封裝一下CTMediator的使用方法:
- 這里要解釋一下為什么要在方法內(nèi)部去設(shè)置callback、kCTMediatorParamsKeySwiftTargetModuleName 這兩個參數(shù)油航,因為使用者大概率是不用去關(guān)心這兩個參數(shù)的崭庸,所以我選擇在方法內(nèi)部去賦值。
public class SPMediator {
@discardableResult
static func performTarget(_ target: MediatorService, callback:@escaping (Any) -> Void) -> Any? {
let callbackParams: [String: Any] = ["callback": callback, kCTMediatorParamsKeySwiftTargetModuleName: target.service.moudle]
return CTMediator.sharedInstance()?.performTarget(
target.service.target,
action: target.service.action,
params: target.service.commonParams.merging(callbackParams, uniquingKeysWith: { _ , _ in }),
shouldCacheTarget: target.service.shouldCacheTarget)
}
}
3. 創(chuàng)建設(shè)置參數(shù)枚舉谊囚, 并遵守協(xié)議(1)怕享,設(shè)置協(xié)議參數(shù):
public enum BalanceService: SPTargetType {
case balance
case test([String: Any])
public var commonParams: [String : Any] {
switch self {
case .balance:
return ["animation": true]
case .login(let params):
return ["id": params["id"] ?? ""]
}
}
/// 區(qū)分每個業(yè)務(wù)模塊
public var moudle: String {
switch self {
default:
return "SPRouteModule"
}
}
public var target: String {
switch self {
default:
return "Balance"
}
}
public var action: String {
switch self {
case .balance:
return "Test_ViewController"
case .login(_):
return "Login_ViewController"
}
}
public var shouldCacheTarget: Bool {
return true
}
}
4. 使用:
比如我需要Balance的控制器:
guard let result = (SPMediator.performTarget(MediatorService.balance(BalanceService.balance)) { (params) in
print(params)
}) as? UIViewController else {
return
}
回調(diào)適用于耗時、異步操作等镰踏,其它情況直接拿到返回值然后轉(zhuǎn)成自己需要的Class就可以了函筋。
我這里使用的是
MediatorService
,因為我最后針對每個Service
做了一層封裝奠伪,統(tǒng)一調(diào)用入口驻呐。