以下是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 :(得分:-1)
首先,您不应该从视图控制器发送请求。这太“臭了”。
关于你的问题,没有明确的答案。 网络是一项足够大的任务,可以作为应用程序架构中的单独层实现。 如何实现它...这真的是一个难题。 我想,有很多方法可以做到这一点,就像许多开发人员一样。 它还取决于您使用的应用程序架构模式(MVC,MVP,VIPER,MVVM等)。
至于我,我总是通过服务进行联网。 我有许多类封装了AFNetworking / Alamofire。只有专门的服务才能解决这些问题(每个概念一个服务,例如授权服务,用户服务,产品服务,无论服务)。
我当然建议您调查此问题。您可以从阅读我上面提到的架构模式开始。然后 - 特别是关于网络层。 首先 - 这可能会有所帮助:
https://talk.objc.io/episodes/S01E01-networking
该视频曾让我了解我现在正在使用的一些想法。 但请记住 - 您的视图控制器中没有网络调用=))