iOS 애플리케이션에서 라우팅 활용도 향상 - Swift
번역: 이 글에서 나는 내가 이전에 프로그램 개발에서 사용했던 iOS 프로그램을 더욱 튼튼하게 할 수 있는 재사용 클래스를 토론할 것이다.최근에 나는 네트워크 요청의 서로 다른 유형의 URL을 해결하기 위해 네비게이션 루트 클래스가 필요하다.예:.GET .POST .PUT DELETE HTTP 등등하나의 단독 클래스로 네트워크 작업을 처리하기 때문에 루트를 사용자 정의해야 한다. 이것은 Alamofire를 바탕으로 이루어진 것이다.
원문 그림
라우팅이란?
라우팅은 API/Microservice urls를 개체를 대상으로 처리하지만 그 자체는 매거진 형식을 사용합니다.즉, 매거진 중의 URL 요청 방법으로 네트워크 요청을 진행하여 틈새 없는 동의와 간소화를 얻었다.참조 문서: Alamofire에 대한 라우팅 작성 방법
라우팅 프로토콜 작성
REST의 네 가지 요청 방법 (get,post, 업데이트,destroy) 을 호환하는
RouterProtocol
프로토콜을 먼저 만듭니다.// MARK: - Router
protocol RouterProtocol {
var apiType: ApiType { get set }
func post() -> String
func get(identifier: String) -> String
func update(identifier: String) -> String
func destroy(identifier: String) -> String
}
struct AccountsRouter: RouterProtocol {
var apiType = ApiType.Accounts
func post() -> String { return apiType.route }
func get(identifier: String) -> String { return "\(apiType.route)/\(identifier)" }
func update(identifier: String) -> String { return "\(apiType.route)/\(identifier)" }
func destroy(identifier: String) -> String { return "\(apiType.route)/\(identifier)" }
}
그런 다음
Router
의 열거를 정의합니다.RouterProtocol
, 호출 방법을 준수한다.Router
매거는 반드시 범형이어야 하며 사용한 준수RouterProtocol
의 구조체를 수신해야 한다.NSMutableURLRequest
의 속성URLRequest
은 일반적인 설정, 예를 들어 방법명, 기본 요청 헤더, 사용자token 등을 추가하는 데 사용된다.Alamofire
의 매개 변수 인코딩을 사용하여 인코딩합니다./////Router.swift////Created by Seyhun Akyürek on 01/10/2016.//Copyright © 2016 seyhunak. All rights reserved.//import Foundation import Alamofire//MARK: - Router protocol RouterProtocol { var apiType: ApiType { get set } func post() -> String func get(identifier: String) -> String func update(identifier: String) -> String func destroy(identifier: String) -> String } enum Router: URLRequestConvertible { case post(T, [String: AnyObject])
case get(T, String)
case update(T, String, [String: AnyObject])
case destroy(T, String)
var method: Alamofire.Method {
switch self {
case .post:
return .POST
case .get:
return .GET
case .update:
return .PUT
case .destroy:
return .DELETE
}
}
var path: NSURL {
switch self {
case .post(let object, _):
return object.apiType.path
case .get(let object):
return object.0.apiType.path
case .update(let object):
return object.0.apiType.path
case .destroy(let object):
return object.0.apiType.path
}
}
var route: String {
switch self {
case .post(let object, _):
return object.post()
case .get(let object, let identifier):
return object.get(identifier)
case .update(let object, let identifier, _):
return object.update(identifier)
case .destroy(let object, let identifier):
return object.destroy(identifier)
}
}
// MARK: - URLRequestConvertible
var URLRequest: NSMutableURLRequest {
let task = NSURLSession.sharedSession().dataTaskWithURL(path) {
(data, response, error) in
if error != nil {
return
}
}
task.resume()
let mutableURLRequest = NSMutableURLRequest(URL: path.URLByAppendingPathComponent(route))
mutableURLRequest.HTTPMethod = method.rawValue
mutableURLRequest.timeoutInterval = NSTimeInterval(10 * 1000)
if let token = oauthToken {
mutableURLRequest.setValue("Bearer \(token)", forHTTPHeaderField: "Authorization")
mutableURLRequest.addValue("application/x-www-form-urlencoded", forHTTPHeaderField: "Content-Type")
}
switch self {
case .post(_, let parameters):
return Alamofire.ParameterEncoding.URL.encode(mutableURLRequest, parameters: parameters).0
case .update(_, _, let parameters):
return Alamofire.ParameterEncoding.URL.encode(mutableURLRequest, parameters: parameters).0
default:
return mutableURLRequest
}
}
}
응용 프로그램
사용
Router
은 상당히 간단합니다. 당신의 ApiManager
에서 방법을 정의하기만 하면 됩니다.//MARK: - Account
func getAccounts(accountRequest: AccountsRequest, completion: (accountsResponse: AccountsResponse) -> ()) -> Request {
weak var weakSelf = self
weakSelf?.errorManager.handleReachability()
store.dispatch(LoadingShowAction(type: .Normal))
return manager.request(Router.get(AccountsRouter(), accountRequest.accountId!).URLRequest)
.validate()
.responseObject {(response: Result) in
self.handleResponse(response, completion: { (accountsResponse) in
store.dispatch(LoadingHideAction())
completion(accountsResponse: accountsResponse)
})
}
}
github:Router
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.