在OC中,我们使用AFNetworking来进行网络请求,简洁方便。在swift中,我们使用Moya来进行网络请求,Moya封装了Alamofire,可以更加方便的进行网络请求。初次使用Moya,还是觉得稍稍有些不习惯。在这里,记录下使用过程。
一、新建项目,新建cocoapod,导入Moya库。
platform :ios, '9.0'
inhibit_all_warnings!
target 'IJKPlayerDemo' do
use_frameworks!
pod 'Moya'
end
导入之后,我们发现项目中多了几个文件:
这就是Moya的库文件了。
二、新建三个文件,当然了,放在一个文件里也是可以的。不过,放在三个文件里是为了更加清晰和方便管理。
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 {
}
}
}
}
结果截取部分: