V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
iOS 开发实用技术导航
NSHipster 中文版
http://nshipster.cn/
cocos2d 开源 2D 游戏引擎
http://www.cocos2d-iphone.org/
CocoaPods
http://cocoapods.org/
Google Analytics for Mobile 统计解决方案
http://code.google.com/mobile/analytics/
WWDC
https://developer.apple.com/wwdc/
Design Guides and Resources
https://developer.apple.com/design/
Transcripts of WWDC sessions
http://asciiwwdc.com
Cocoa with Love
http://cocoawithlove.com/
Cocoa Dev Central
http://cocoadevcentral.com/
NSHipster
http://nshipster.com/
Style Guides
Google Objective-C Style Guide
NYTimes Objective-C Style Guide
Useful Tools and Services
Charles Web Debugging Proxy
Smore
racechao
V2EX  ›  iDev

在 Swift 下的网络请求层简单的抽象思路分享...

  •  
  •   racechao ·
    alfredcc · 2016-09-21 10:39:02 +08:00 · 3226 次点击
    这是一个创建于 3004 天前的主题,其中的信息可能已经有所发展或是发生改变。

    https://github.com/alfredcc/Archi

    Before:

    Alamofire.request(.GET, "https://httpbin.org/get", parameters: ["foo": "bar"])
             .responseJSON { response in
                  // 1. Validate
                  if response.result.isSuccess {
                    // 2. Parse JSON data
                    let object = JSONParseor(response.result.value)
                    print(object)
                  } else {
                    // handle failure data
                  }
             }
    

    Alfter:

    APIClient.events(arg1, arg2: arg2) { (result) in
        switch result {
            case let .Success(value):
                print(value)
            case let .Failure(status, description):
                print("status: \(status); description: \(description)")
        }
    }
    

    代码说明:

    一、通过 enum 将 request 拆分了成了四个模块 1. Endpoint 2. Path 3. Method 4. Parameters

    二、通过 _request() 方法再次将 1. Endpoint 2. Path 3. Method 4. parameters 重组成一个 request

    三、通过 Result 区分 Success 和 Failure 是回调方法中减少 if ... else 的嵌套,逻辑更加清晰

    四、利用 Generic 和 Protocol 在 _request() 方法中统一解析 JSON data (只要对象遵循 JSONAbleType )

    这样做的好处:

    有利与 RESTFul API 的业务逻辑编写 所有接口通是过了一道 _request(),可以在这里做一些通用的逻辑处理 最终的请求回调中以然不需要去处理 JSON data 的解析,返回的是一个直接可用的 model 对象

    7 条回复    2016-09-23 07:53:51 +08:00
    kouryu
        1
    kouryu  
       2016-09-21 10:45:31 +08:00 via iPhone
    这不是 Moya 干的事情么,
    jinzhe
        2
    jinzhe  
       2016-09-21 11:15:06 +08:00
    swift 闭包真心不喜欢,感觉乱
    plqws
        3
    plqws  
       2016-09-21 11:22:15 +08:00
    还是用 promise 好
    myrual
        4
    myrual  
       2016-09-21 11:32:26 +08:00
    感觉过度设计。
    在第三方库的基础上做一个库对自己是一个很好的提高。
    racechao
        5
    racechao  
    OP
       2016-09-21 14:45:26 +08:00
    @kouryu 对呀,就是参考的 Moya 来做的,但是平时开发的时候 Moya 里面很多功能没用到,所以就自己封装了一个轻量级的。

    @jinzhe @plqws 恩, promise 可以去掉 switch case 这样会好很多,有时间去优化下代码。
    itoolset
        6
    itoolset  
       2016-09-21 23:07:51 +08:00
    我觉得还不如猫大的 Demo 好。。
    https://github.com/MDCC2016/ProtocolNetwork
    racechao
        7
    racechao  
    OP
       2016-09-23 07:53:51 +08:00
    @itoolset 恩,瞄大更加 Simple 。谢谢
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1559 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 16:47 · PVG 00:47 · LAX 08:47 · JFK 11:47
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.