iOS 애플리케이션에서 라우팅 활용도 향상 - Swift

5286 단어
원본 주소:https://medium.com/swift-programming/better-routing-for-ios-applications-with-router-in-swift-9b47cc8cb4c7#.9dhtbth5f
번역: 이 글에서 나는 내가 이전에 프로그램 개발에서 사용했던 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의 구조체를 수신해야 한다.
  • 는 네 가지 수신 방법(.GET.POST.PUT.DELETE)에 대해 방법, 경로와 루트 속성을 정의한다.
  • 생성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

    좋은 웹페이지 즐겨찾기