Moya的简单使用

Moya是对 Alamofire的进一步封装。

  • 简化了网络请求
  • 方便维护
  • 方便单元测试

使用Moya,项目中网络请求的部分可能长这样

点击查看官方教程

Moya发送简单的网络请求

枚举类型需满足TargetType协议

  public protocol TargetType {
    var baseURL: NSURL { get }
    var path: String { get }
    var method: Moya.Method { get }
    var parameters: [String: AnyObject]? { get }
    var sampleData: NSData { get }
}

实现一个枚举代码如下:
(sampleData是接收到的数据实例)

import Moya

enum Joke {

    case  Image(count:Int,page:Int)
    
    case  Video(count:Int,page:Int)

    case  latest(count:Int,page:Int)

}


extension Joke : TargetType{

    var baseURL: NSURL {
        return NSURL(string: "http://m2.qiushibaike.com/article/list")!
    }
    
    var path: String {
        switch  self {
        case .Image:
            return "/imgrank"
        case .Video:
            return "/video"
        case .latest:
            return "/latest"
        }
    }
    
    var method: Moya.Method {
        
        return .GET
    }
    
    var parameters: [String: AnyObject]? {
        
        return ["page":"1","count":"4"]
    }
    
    var sampleData: NSData {
        return "{\"login\": \"xiaoMing\", \"id\": 100}".dataUsingEncoding(NSUTF8StringEncoding)!
    }

}


现在就可以发送简单的网络请求了:

  1. 定义一个全局变量MoyaProvider(防止自动释放,网络请求被cancel掉)

    let provider = MoyaProvider<Joke>()

  2. 发送网络请求(暂且不管返回的result

        provider.request(Joke.Image(count: 1, page: 1)) { (result) -> () in
            
            print(result)
            
        }
MoyaProvider的初始化

我们观察下MoyaProvider的初始化方法. MoyaProvider初始化都是有默认值的

    public init(endpointClosure: EndpointClosure = MoyaProvider.DefaultEndpointMapping,

        requestClosure: RequestClosure = MoyaProvider.DefaultRequestMapping,

        stubClosure: StubClosure = MoyaProvider.NeverStub,

        manager: Manager = MoyaProvider<Target>.DefaultAlamofireManager(),

        plugins: [PluginType] = []) {
         ...

参数:

  • EndpointClosure

    • 可以对请求参数做进一步的修改,如可以修改endpointByAddingParameters endpointByAddingHTTPHeaderFields
  • RequestClosure 你可以在发送请求前,做点手脚. 如修改超时时间,打印一些数据等等

  • StubClosure可以设置请求的延迟时间,可以当做模拟慢速网络

  • Manager 请求网络请求的方式。默认是Alamofire

  • [PluginType]一些插件。回调的位置在发送请求后,接受服务器返回之前

EndpointClosure
public class MoyaProvider<Target: TargetType> {
    
    /// Closure that defines the endpoints for the provider.
    public typealias EndpointClosure = Target -> Endpoint<Target>
    ...

默认的实现方式 (MoyaProvider.DefaultRequestMapping


    let myEndpointClosure = { (target: Joke) -> Endpoint<Joke> in
        
        let url = target.baseURL.URLByAppendingPathComponent(target.path).absoluteString
        
        return Endpoint(
            
            URL: url,
            
            sampleResponseClosure:
            {.NetworkResponse(200, target.sampleData)},
            
            method: target.method,
            
            parameters: target.parameters
            
            )
    }
    

还可以通过Endpoint的初始化方法指定 parameterEncodinghttpHeaderFields。parameterEncoding 可以是.URL, .JSON, .PropertyList, and .Custom ,这些都是和Alamofire parameter encodings对应的.

额外的,moya提供的添加httpHeaderFields的方法.

    let myEndpointClosure = { (target: Joke) -> Endpoint<Joke> in
        
        let url = target.baseURL.URLByAppendingPathComponent(target.path).absoluteString
        
  let endpoint: Endpoint<GitHub> = Endpoint<GitHub>(
        
        URL: url(target),
        
        sampleResponseClosure: {.NetworkResponse(200, target.sampleData)},
        
        method: target.method,
        
        parameters: target.parameters
    )
    
    return endpoint.endpointByAddingHTTPHeaderFields(["APP_NAME": "MY_AWESOME_APP"])

    }
    
RequestClosure

    let requestClosure = { (endpoint: Endpoint<Joke>, done: NSURLRequest -> Void) in
        
        let request = endpoint.urlRequest
        
        /**
        *  在这儿可以按你的需要,对网络请求做些修改
        如修改超时时间
        let requestMut = endpoint.urlRequest.mutableCopy() as! NSMutableURLRequest~~
        requestMut.timeoutInterval = 10
        */ 
    
        
        done(request)
    }
manager

默认是Alamfire,也可以自己定制。如添加ssl等。 具体 点击

PluginType

默认集成了3个

例如发送请求就显示菊花


    let networkPlugin1 = NetworkActivityPlugin { (change) -> () in
        
        print("networkPlugin \(change)")
        
        switch(change){
            
        case .Ended:
            
            UIApplication.sharedApplication().networkActivityIndicatorVisible = false
            
        case .Began:
            
            UIApplication.sharedApplication().networkActivityIndicatorVisible = true
        
        }        
    }

点击查看官方教程

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 文章摘自Moya官方文档 Targets Moya的使用始于定义一个target——典型的是定义一个符合Targe...
    Jt_Self阅读 16,329评论 0 27
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,337评论 19 139
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 175,216评论 25 709
  • 两年前的七月,当我毅然决然地从学校出来,往南而至广东时,并没有意识到,单纯而天真的学生时代,已就此结束,化作了记忆...
    卿本佳人奈何倾城阅读 2,607评论 0 1
  • 生活就像一本未写完的书,你永远不知道下一秒会发生什么! 今天去书店发现了仓央嘉措的诗歌,毫不犹豫的买下来了,无意中...
    Jenny日记阅读 2,394评论 0 1