美文网首页swift
swift4,网络请求工具Moya

swift4,网络请求工具Moya

作者: 小曼blog | 来源:发表于2018-05-29 11:42 被阅读10次

    在OC中,我们使用AFNetworking来进行网络请求,简洁方便。在swift中,我们使用Moya来进行网络请求,Moya封装了Alamofire,可以更加方便的进行网络请求。初次使用Moya,还是觉得稍稍有些不习惯。在这里,记录下使用过程。

    一、新建项目,新建cocoapod,导入Moya库。

    platform :ios, '9.0'
    inhibit_all_warnings!
    
    target 'IJKPlayerDemo' do
        use_frameworks!
        pod 'Moya'
    end
    

    导入之后,我们发现项目中多了几个文件:


    image.png

    这就是Moya的库文件了。

    二、新建三个文件,当然了,放在一个文件里也是可以的。不过,放在三个文件里是为了更加清晰和方便管理。

    image.png

    NetService.swift

    //
    //  NetService.swift
    //  IJKPlayerDemo
    //
    //  Created by iOS on 2018/5/28.
    //  Copyright © 2018年 weiman. All rights reserved.
    //
    
    import UIKit
    
    enum NetService {
        /// 直播列表数据
        case liveList
    }
    
    

    这个文件是存储接口的名称的,也就是每一个网络请求都会有一个自定义的名字,类似于函数的声明。这里要把参数也要写全。

    NetService+Extension.swift

    //
    //  NetService+Extension.swift
    //  IJKPlayerDemo
    //
    //  Created by iOS on 2018/5/28.
    //  Copyright © 2018年 weiman. All rights reserved.
    //
    
    import UIKit
    import Moya
    
    /// NetService的扩展,记得一定要遵循TargetType协议。
    extension NetService: TargetType {
        // 根路径,一般放域名
        var baseURL: URL {
            return URL(string: "http://www.mocky.io/v2")!
        }
        // 具体路径,每一个网络请求的具体路径部分
        var path: String {
            switch self {
            case .liveList:
                return "5b0cc5153300005200b400aa"
            }
        }
        // 请求方式,get还是post
        var method: Moya.Method {
            switch self {
            case .liveList:
                return .get
            }
        }
          // 参数  
        var task: Task {
            switch self {
            case .liveList:
                let param = ["t" : "\(Date().timeIntervalSince1970)"]
                return .requestCompositeData(bodyData: Data(), urlParameters: param)
            }
        }
       // 暂时不知道干啥的
        var sampleData: Data {
            switch self {
            default: return Data()
            }
        }
        //这个应该是请求的类型头
        var headers: [String: String]? {
            return ["Content-type": "application/json"]
        }
            
    }
    
    //MARK: - Helpers
    private extension String {
        var urlEscaped: String {
            return addingPercentEncoding(withAllowedCharacters: .urlHostAllowed)!
        }
        
        var utf8Encoded: Data {
            return data(using: .utf8)!
        }
    }
    
    extension Task {
        static func json(_ parameters: [String: Any]) -> Task {
            return .requestParameters(
                parameters: parameters,
                encoding: JSONEncoding.default
            )
        }
    }
    
    
    

    这是NetService的扩展,你也可以写在一个文件中。不过,为了区分,就把网络请求名称列表和公共“实现”部分分开了写。

    API.swift

    //
    //  API.swift
    //  IJKPlayerDemo
    //
    //  Created by iOS on 2018/5/28.
    //  Copyright © 2018年 weiman. All rights reserved.
    //
    
    import UIKit
    import Moya
    
    let provider = MoyaProvider<NetService>()
    
    

    这样,基本的网络请求基础部分已经搭建完了,剩下的就是使用了。

    三、开始请求

    我在这里又新建了一个用于网络请求的文件:LoadDataHelper

    //
    //  LoadDataHelper.swift
    //  IJKPlayerDemo
    //
    //  Created by iOS on 2018/5/28.
    //  Copyright © 2018年 weiman. All rights reserved.
    //
    
    import UIKit
    import Moya
    
    enum LoadDataHelper {
        
        static func loadData(success: @escaping (_ data: Data) -> Void) {
            provider.request(.liveList) { (result) in
                switch result {
                case .success(let value):
                    
                    do {
                        let data = value.data
                        let dataAsJSON = try JSONSerialization.jsonObject(with: data)
                        let prettyData = try JSONSerialization.data(withJSONObject: dataAsJSON, options: .prettyPrinted)
                        success(prettyData)
                    } catch {
                        
                    }
                    
                case .failure(let error):
                    print("--请求失败-- \(error)")
                }
            }
        }
    }
    
    

    四、vc中使用

    //
    //  ViewController.swift
    //  IJKPlayerDemo
    //
    //  Created by iOS on 2018/5/28.
    //  Copyright © 2018年 weiman. All rights reserved.
    //
    
    import UIKit
    import Foundation
    import IJKMediaFramework
    
    
    class ViewController: UIViewController {
    
        override func viewDidLoad() {
            super.viewDidLoad()
            
            loadData()
            
        }
    
        override func didReceiveMemoryWarning() {
            super.didReceiveMemoryWarning()
            // Dispose of any resources that can be recreated.
        }
        
        func loadData() {
            LoadDataHelper.loadData { (data) in
                
                do {
                    let json = try JSONSerialization.jsonObject(with: data, options: .allowFragments)
                    print("---------  \(json)")
                    
                } catch {
                    
                }
            }
        }
        
    }
    
    

    结果截取部分:

    image.png

    相关文章

      网友评论

        本文标题:swift4,网络请求工具Moya

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