Swift Moya
网络层这一块用Alamofire,如同于在oc中用AFNetworking.但是,如果你直接使用的话,会使得各种网络请求操作分布很凌乱,所以我选择了巧神封装的YTKNetwork,很好用,有兴趣的可以看一下.当然你也可以自己组织封装. NSDictionary *parameterDic = @{kPageSizeKey:@"10",kCurPageKey:@"1",kLastIDKey:@"0"};
[[WCRequestDataManager sharedRequestDataManager] requestDataForNetWorkWithDataHandleType:WCProductListDataHandleType
parameterDic:parameterDic
completed:^(WCProductResultModel *resultModel) {}
failure:^(NSString *msg) {}
];
那么Swift中推荐一下Moya,这是一个基于 Alamofire.request(.GET,kRequestServerKey + "services/creditor/product/list/page/2/0/0").responseJSON {
response in
if let value = response.result.value {
let result = Mapper<CommonInfo>().map(value)
let dataList = Mapper<ProductModel>().mapArray(result?.data?["result"])
print("Alamofire = (dataList?[0].productDesc)") // Alamofire = Optional("gfhgfgfhgshgdsfdshgfshfgh")
}
}
MoyaTest.sharedInstance.requestDataWithTarget(.productList(pageSize: 2,curpage: 0,lastID: 0),type: ProductModel.self,successClosure: { result in
let dataList = Mapper<ProductModel>().mapArray(result["result"])
print("Moya = (dataList?[0].productDesc)") // Moya = Optional("gfhgfgfhgshgdsfdshgfshfgh")
}) { errorMsg in
print(errorMsg)
}
可见,第二种隐藏了
Targets使用 // ProductApi case productList(pageSize: Int,curpage: Int,lastID: Int) // case productDetail(id: Int) public var path: String { switch self { case .login(_,_): return "services/crane/sso/login/doLogin" case .register: return "services/crane/sso/login/register" case let .productList(pageSize,curpage,lastID): return "services/creditor/product/list/page/"+String(pageSize)+"/"+String(curpage)+"/"+String(lastID) } } public var method: Moya.Method { switch self { case .login(_,_),.register: return .POST case .productList(_,_,_): return .GET } } public var parameters: [String: AnyObject]? { switch self { case let .login(loginName,password): return ["loginName": loginName,"userPassword": password] default : return nil } } // 单元测试用 public var sampleData: NSData { return "{}".dataUsingEncoding(NSUTF8StringEncoding)! } } Providers和Endpoints
let requestProvider = RxMoyaProvider<RequestApi>()
最终的请求发起对象就是 /// Initializes a provider.
public init(endpointClosure: EndpointClosure = MoyaProvider.DefaultEndpointMapping,requestClosure: RequestClosure = MoyaProvider.DefaultRequestMapping,stubClosure: StubClosure = MoyaProvider.NeverStub,manager: Manager = Alamofire.Manager.sharedInstance,plugins: [PluginType] = []) {
self.endpointClosure = endpointClosure
self.requestClosure = requestClosure
self.stubClosure = stubClosure
self.manager = manager
self.plugins = plugins
}
/// Mark: Defaults
public extension MoyaProvider {
// These functions are default mappings to endpoings and requests.
public final class func DefaultEndpointMapping(target: Target) -> Endpoint<Target> {
let url = target.baseURL.URLByAppendingPathComponent(target.path).absoluteString
return Endpoint(URL: url,sampleResponseClosure: {.NetworkResponse(200,parameters: target.parameters)
}
public final class func DefaultRequestMapping(endpoint: Endpoint<Target>,closure: NSURLRequest -> Void) {
return closure(endpoint.urlRequest)
}
}
Requestimport Foundation
import Moya
import RxSwift
import ObjectMapper
import SwiftyJSON
typealias SuccessClosure = (result: AnyObject) -> Void
//typealias SuccessClosure = (result: Mappable) -> Void
typealias FailClosure = (errorMsg: String?) -> Void
enum RequestCode: String {
case failError = "0"
case success = "1"
}
class MoyaTest {
static let sharedInstance = MoyaTest()
private init(){}
let requestProvider = RxMoyaProvider<RequestApi>()
func requestDataWithTarget<T: Mappable>(target: RequestApi,type: T.Type,successClosure: SuccessClosure,failClosure: FailClosure) {
let _ = requestProvider.request(target).subscribe { (event) -> Void in
switch event {
case .Next(let response):
let info = Mapper<CommonInfo>().map(JSON(data: response.data,options: .AllowFragments).object)
guard info?.code == RequestCode.success.rawValue else {
failClosure(errorMsg: info?.msg)
return
}
guard let data = info?.data else {
failClosure(errorMsg: "数据为空")
return
}
successClosure(result: data)
case .Error(let error):
print("网络请求失败...(error)")
default:
break
}
}
}
}
最后的请求方法封装,如上面的栗子: ok!差不多
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |