Swift网络请求 - RXSwift + PromiseKit + Moya

Moya是基于Alamofire网络框架上进行的封装,支持RXSwift

创建模型
import Foundation

/// 实用泛行实现通用格式
public struct ResponseData<T>: Codable where T: Codable {
   
    let code: String
    let message: String
    let data: T?
}


public struct Post: Codable {
   
    let id: Int
    let title: String
    let body: String
    let userID: Int
}

extension Post {
   
    enum CodingKeys: String, CodingKey {
   
        case id
        case title
        case body
        case userID = "userId" //自定义key
    }
}
定义TargetType
import Moya

public enum ServerApi {
   
    ///定义请求接口参数
    case getNews(channel: String, start: Int, num: Int)
    case getPosts(id: Int)
}

/// 实现协议方法
extension ServerApi: TargetType {
   
    public var baseURL: URL {
   
        #if DEVELOP
        return URL(string: "http://localhost:3000")!
        #elseif PREVIEW
        return URL(string: "http://localhost:3000")!
        #else
        return URL(string: "http://localhost:3000")!
        #endif
    }
    /// 路径拼接
    public var path: String {
   
        switch self {
   
        case .getNews: ///获取新闻列表
            return "/getNews"
        case .getPosts:
            return "/posts"
        }
    }
    ///请求方式
    public var method: Method {
   
        switch self {
   
        case .getNews:
            return .post
        case .getPosts:
            return .get
        }
    }
    ///编码格式
    public var sampleData: Data {
   
        return "".data(using: .utf8)!
    }
    
    /// 请求任务
    public var task: Task {
   
        switch self {
   
        case .getNews(let channel, let start, let num):
            
            let param: [String: Any] = ["channel":channel,"start":start,"num": num]
            return .requestParameters(parameters: param, encoding: URLEncoding.default)
            
        case .getPosts(let userId):
            let param: [String: Int] = ["userId":userId]
            return .requestParameters(parameters: param, encoding: URLEncoding.default)
            
        }
    }
    
    /// heder 可根据不同的接口设置不通的header
    public var headers: [String : String]? {
   
        return nil
    }
    
}

网络请求管理
import Moya
import RxSwift
import PromiseKit

/// 服务器网络请求
public struct APIProvider<Target: TargetType> {
   
    
    private let _disposeBag = DisposeBag()
    ///定义网络请求发起着
    private let _privider = MoyaProvider<Target>(callbackQueue: .global(), session:{
   () -> Session in
        
        // 配置特殊网络需求
        let serverTrustManager = APIServerTrustManager()
        let interceptor = APIRequestInterceptor()
        let configuration = URLSessionConfiguration.default
        configuration.timeoutIntervalForRequest = 15 //设置请求超时时间
        configuration.headers = .default
        return Session(configuration: configuration,
                              interceptor: interceptor,
                              serverTrustManager: serverTrustManager,
                              redirectHandler: nil,
                              cachedResponseHandler: nil,
                              eventMonitors: [])
        
    }(),  plugins: [NetWorksActivityPlugin(),
                    NetWorksLoggerPlugin()])
    
    /// 网络请求
    ///
    /// - Parameters:
    ///   - target: API类型
    ///   - observeOn: 发起请求的Scheduler
    ///   - subscribeOn: 相应请求返回的Scheduler
    ///   - retryCount: 发生错误时重试次数
    /// - Returns: 指定范型的Promise
    public func request<T: Codable>(targetType: Target,
                                    observeOn: ImmediateSchedulerType = ConcurrentDispatchQueueScheduler(queue: DispatchQueue.global()),
                                    subscribeOn: ImmediateSchedulerType = MainScheduler.instance) -> Promise<T> {
   
        
        return Promise {
   <
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值