美文网首页iOS开发技术分享iOS Developer
RxSwift网络请求之Alamofire的简单二次封装,仿Mo

RxSwift网络请求之Alamofire的简单二次封装,仿Mo

作者: 9ad91f89b29e | 来源:发表于2016-08-28 09:56 被阅读2324次

定义一个协议TargetType来约束网络请求参数,这些参数是Alamofire.request中所需要的参数,当然可以删减和扩展,Method和EncodingType在EndPoint.swift中定义

//Target.swift
import Foundation
public protocol TargetType {
    var baseURL: NSURL { get }
    var path: String { get }
    var method: Method { get }
    var parameters: [String: AnyObject]? { get }
    var encoding:EncodingType {get}
    var headers:[String: String]? {get}
}```
定义一个EndPoint类,将Target和Alamofire进行封装,并用typealias来声明一些在其他类中需要用到Alamofire中的某些类型,这样在其他类中就不需要导入Alamofire这个库,所有关于Alamofire的封装都在EndPoint这个类进行

//EndPoint.swift
import Foundation
import Alamofire

public typealias Method = Alamofire.Method
public typealias ResponseJSON = Response<AnyObject, NSError>
public typealias ResponseData = Response<NSData, NSError>
public typealias ResponseString = Response<String, NSError>
public typealias EncodingType = Alamofire.ParameterEncoding

public class EndPoint<Target:TargetType> {
}

extension EndPoint {
public func request(target:Target) -> Alamofire.Request {
let url = target.baseURL.URLByAppendingPathComponent(target.path).absoluteString
let request = Alamofire.request(target.method, url, parameters: target.parameters, encoding: target.encoding,headers:target.headers )
return request
}
}```
最后创建一个RxZainProvider类,作为网络请求的接口,这里只写了requestJSON,可以用同样的方法扩展requestData,requestString。

//RxZainProvider.swift
import Foundation
import RxSwift

public class RxZainProvider<Target:TargetType> {    
    
}
extension RxZainProvider {
  public func requestJSON(target: Target) -> Observable<ResponseJSON> {
        return Observable.create({ (observer) -> Disposable in//创建信号源
            let request = EndPoint<Target>().request(target)//返回Alamofire.Request类型
            //Alamofire中responseJSON方法
            request.responseJSON{ (response) in
                if let error = response.result.error {
                    observer.onError(error)
                }else {
                    observer.onNext(response)
                    observer.onCompleted()
                }
            }
            return AnonymousDisposable{
                request.cancel()//请求结束,取消请求
            }
        })        
    }
}```
**应用**
创建一个UserAPI.swift

//UserAPI.swift
let UserProvider = RxZainProvider<UserAPI>()

public enum UserAPI {
case Users
}
extension UserAPI: TargetType {
public var baseURL: NSURL { return NSURL(string: "https://rxswift.leanapp.cn")! }
public var path: String {
switch self {
case .Users:
return "/users"
}
}
public var method: Method {
return .GET
}
public var parameters: [String: AnyObject]? {
return nil
}
public var encoding: EncodingType {
return .JSON
}
public var headers: [String : String]? {
return nil
}
}```

let disposeBag = DisposeBag()
override func viewDidLoad() {
    UserProvider.request(.Users)
        .subscribeNext { print($0.result.value) }
        .addDisposableTo(disposebag)
}

相关文章

网友评论

    本文标题:RxSwift网络请求之Alamofire的简单二次封装,仿Mo

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