2017-02-21 72 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

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

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

至于我,我总是通过服务进行联网。 我有一些封装寻址AFNetworking/Alamofire的类。只有专门的服务才能解决这些类别(每个概念有一项服务,例如授权服务,用户服务,产品服务,任意服务)。

我当然推荐你去调查这个问题。您可以从阅读上面提到的架构模式开始。然后 - 具体关于网络层。 要开始使用 - 这可能是有帮助的:

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

该视频一次给我带来了一些想法,我现在使用。 但请记住 - 在您的视图控制器中没有网络电话=))

+1

我的问题是相当深的,它确实是关于一个单独的层(甚至更进一步,即使Alamofire不粘连到单独的网络层的抽象层) 。这比你所谈论的还要更进一步。所以我的问题是关于使用Alamofire路由器实现网络抽象层的最佳实践。 – sleepwalkerfx