【问题标题】:Proper usage of Alamofire routers正确使用 Alamofire 路由器
【发布时间】:2017-07-10 23:34:11
【问题描述】:

这是一个 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

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

【问题讨论】:

  • 我希望一年后你能找到答案……你想到了什么?你能分享一下这个问题的答案吗?我相信很多人都会从中受益......

标签: ios swift design-patterns swift3 alamofire


【解决方案1】:

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

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

就我而言,我总是通过服务来建立网络。 我有许多封装寻址 AFNetworking/Alamofire 的类。并且只有专门的服务才能解决这些类(每个概念一个服务,例如授权服务、用户服务、产品服务、其他服务)。

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

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

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

【讨论】:

  • 我的问题相当深刻,它确实是关于一个单独的层(甚至更进一步,一个抽象层,即使 Alamofire 也没有粘在那个单独的网络层上)。这比你所说的更进一步。所以我的问题是关于使用 Alamofire 路由器实现网络抽象层时的最佳实践。
猜你喜欢
  • 2014-12-12
  • 2013-06-29
  • 1970-01-01
  • 2015-07-23
  • 1970-01-01
  • 1970-01-01
  • 2021-03-07
  • 2020-07-29
  • 2021-07-06
相关资源
最近更新 更多