2017-02-21 94 views
1

Вот пример Alamofire маршрутизатораПравильное использование Alamofire маршрутизаторов

import Foundation 
import Alamofire 

enum PostRouter: URLRequestConvertible { 
    static let baseURLString = "http://jsonplaceholder.typicode.com/" 

    case Get(Int) 
    case Create([String: AnyObject]) 
    case Delete(Int) 

    var URLRequest: NSMutableURLRequest { 
    var method: Alamofire.Method { 
     switch self { 
     case .Get: 
     return .GET 
     case .Create: 
     return .POST 
     case .Delete: 
     return .DELETE 
     } 
    } 

    let params: ([String: AnyObject]?) = { 
     switch self { 
     case .Get, .Delete: 
     return (nil) 
     case .Create(let newPost): 
     return (newPost) 
     } 
    }() 

    let url:NSURL = { 
     // build up and return the URL for each endpoint 
     let relativePath:String? 
     switch self { 
     case .Get(let postNumber): 
     relativePath = "posts/\(postNumber)" 
     case .Create: 
     relativePath = "posts" 
     case .Delete(let postNumber): 
     relativePath = "posts/\(postNumber)" 
     } 

     var URL = NSURL(string: PostRouter.baseURLString)! 
     if let relativePath = relativePath { 
     URL = URL.URLByAppendingPathComponent(relativePath) 
     } 
     return URL 
    }() 

    let URLRequest = NSMutableURLRequest(URL: url) 

    let encoding = Alamofire.ParameterEncoding.JSON 
    let (encodedRequest, _) = encoding.encode(URLRequest, parameters: params) 

    encodedRequest.HTTPMethod = method.rawValue 

    return encodedRequest 
    } 
} 

То, что это в основном делает это создать, удалить или получить сообщения. Этот код выглядит чистым для простого приложения, которое делает именно это. Что относительно приложения, которое имеет большое количество конечных точек и моделей? Давайте просто скажем, что мы должны выполнять разные операции с такими объектами, как «Пользователи», «Компании», «Платежи», «Комментарии», «Каналы» и т. Д. Я говорю о большом количестве конечных точек и методов.

В этом случае необходимо создать один маршрутизатор для каждой конечной точки? Не похоже, хорошо ли использовать такой же класс маршрутизатора для всех этих конечных точек.

Аналогичный вопрос был задан здесь: Proper usage of the Alamofire's URLRequestConvertible

Но я до сих пор не удовлетворен ответами на поставленный выше вопрос, поскольку общепринятый ответ предлагает использовать один маршрутизатор для всех конечных точек. Какая здесь самая лучшая практика?

ответ

0

Прежде всего, вы никогда не должны отправлять формы запросов. Это слишком «вонючий».

Что касается вашего вопроса, не может быть определенного ответа. Networking - достаточно большая задача, которая будет реализована как отдельный слой в вашей архитектуре приложения. Как его реализовать ... Это действительно сложный вопрос. Наверное, существует так много способов сделать это, как и у многих разработчиков. Это также зависит от используемого вами шаблона архитектуры приложения (MVC, MVP, VIPER, MVVM и т. Д.)

Что касается меня, я всегда работаю через сети. У меня есть несколько классов, которые инкапсулируют адресацию AFNetworking/Alamofire. И только те услуги, которые посвящены этим услугам, относятся к этим классам (одна услуга на одну концепцию, например, службу авторизации, пользовательское обслуживание, сервисный сервис, безотносительно обслуживания).

Я, безусловно, рекомендую вам изучить этот вопрос. Вы можете начать с чтения о шаблонах архитектуры, о которых я упоминал выше. Затем - особенно о сетевом слое. Для начала - это может быть полезно:

https://talk.objc.io/episodes/S01E01-networking

Это видео один раз привел меня к некоторым идеям я использую в настоящее время. Но помните - нет сетевых вызовов в вашем контроллере просмотров =))

+1

Мой вопрос довольно глубокий, и это действительно отдельный слой (и, кроме того, слой абстракции, где даже Alamofire не приклеен к этому отдельному сетевому слою) , Это еще один уровень, чем то, о чем вы говорите. Поэтому мой вопрос касается лучших практик при использовании маршрутизаторов Alamofire для реализации уровня сетевой абстракции. – sleepwalkerfx