正确使用Alamofire路由器

时间:2017-02-21 11:12:51

标签: ios swift design-patterns swift3 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

但我对上述问题的答案仍然不满意,因为接受的答案建议对所有端点使用相同的路由器。这里的最佳做法是什么?

1 个答案:

答案 0 :(得分:-1)

首先,您不应该从视图控制器发送请求。这太“臭了”。

关于你的问题,没有明确的答案。 网络是一项足够大的任务,可以作为应用程序架构中的单独层实现。 如何实现它...这真的是一个难题。 我想,有很多方法可以做到这一点,就像许多开发人员一样。 它还取决于您使用的应用程序架构模式(MVC,MVP,VIPER,MVVM等)。

至于我,我总是通过服务进行联网。 我有许多类封装了AFNetworking / Alamofire。只有专门的服务才能解决这些问题(每个概念一个服务,例如授权服务,用户服务,产品服务,无论服务)。

我当然建议您调查此问题。您可以从阅读我上面提到的架构模式开始。然后 - 特别是关于网络层。 首先 - 这可能会有所帮助:

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

该视频曾让我了解我现在正在使用的一些想法。 但请记住 - 您的视图控制器中没有网络调用=))