美文网首页iOS 开发
Swift 网络请求 : Moya初步认识

Swift 网络请求 : Moya初步认识

作者: li_礼光 | 来源:发表于2018-07-13 16:07 被阅读401次
    使用Moya创建简单的网络请求
    • Moya初始化
    open class MoyaProvider<Target: TargetType>: MoyaProviderType 
    
    • TargetType
    public protocol TargetType
    
    • MoyaProviderType
    public protocol MoyaProviderType: AnyObject {
        associatedtype Target: TargetType
        /// Designated request-making method. Returns a `Cancellable` token to cancel the request later.
        func request(_ target: Target, callbackQueue: DispatchQueue?, progress: Moya.ProgressBlock?, completion: @escaping Moya.Completion) -> Cancellable
    }
    

    对比OC(简单的)

    如果从OC的网络请求转为swift的Moya请求.关心的几个点.
    1.怎么创建请求对象
    2.如何设置请求参数
    3.回调事件


    1. 创建一个MoyaProvider对象

    image.png
    • a.创建一个testType类型的对象传给MoyaProvider初始化.
    • b.在touchesBegan方法中使用provider发起网络请.

    2.testType类型对象

    enum testType {
        case demo1
        case demo2(name: String)
        case demo3(name: String, score: Int)
    }
    

    这里用枚举创建了几种不同的网络请求情况

    扩展 testType
    //通过扩展遵循协议 : 当一个类型已经符合了某个协议中的所有要求,却还没有声明遵循该协议时,可以通过空扩展体的扩展来遵循该协议:
    //从现在起,targetTypeDemo的实例可以作为 TargetType 类型使用:
    extension testType : TargetType {
     // 请求服务器的根路径
        var baseURL: URL { return URL.init(string: "https://XXXXXXX")! }
        
        // 每个API对应的具体路径
        var path: String {
            switch self {
            case .demo1: return "/get"
            case .demo2(name: _), .demo3(name: _, score: _): return "/post"
            }
        }
        
        // 各个接口的请求方式,get或post
        var method: Moya.Method {
            switch self {
            case .demo1: return .get
            case .demo2, .demo3: return .post
            }
        }
        
        // 请求是否携带参数,如果需要参数,就做如demo2和demo3的设置
        var task: Task {
            switch self {
            case .demo1:                    return .requestPlain // 无参数
            case let .demo2(name):          return .requestParameters(parameters: ["name" : name], encoding: URLEncoding.default) // 带有参数,注意前面的let
            case let .demo3(name, score):   return .requestParameters(parameters: ["name" : name, "score" : score], encoding: URLEncoding.default) // 带有参数,注意前面的let
            }
        }
        
        // 单元测试使用
        var sampleData: Data {
            switch self {
            case .demo1, .demo3: return "just for test".utf8Encoded
            case .demo2(let name): return "{\"name\": \(name)\"}".utf8Encoded
            }
        }
        
        // 请求头
        var headers: [String : String]? {
            return ["Content-type" : "application/json"]
        }
    }
    

    3.回调事件

     provider.request(testType.demo1, callbackQueue: nil, progress: { (response) in
                
            }) { (result) in
                
            }
    

    PS : Moya用了很多的枚举和协议方面知识点.
    参考内容:
    Swift协议
    Moya
    Swift moya - 学习笔记
    系统性学习Moya+Alamofire+RxSwift+ObjectMapper的配合使用
    【iOS开发】Moya入坑记-用法解读篇
    RxSwift: ReactiveX for Swift

    相关文章

      网友评论

        本文标题:Swift 网络请求 : Moya初步认识

        本文链接:https://www.haomeiwen.com/subject/tbehpftx.html