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
        
        }        
    }

点击查看官方教程

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 200,392评论 5 470
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,258评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 147,417评论 0 332
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,992评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,930评论 5 360
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,199评论 1 277
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,652评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,327评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,463评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,382评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,432评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,118评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,704评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,787评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,999评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,476评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,057评论 2 341

推荐阅读更多精彩内容

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