1)我创建一个枚举路由器,为我的模型层中的每个模型实现URLRequestConvertible?
alamofire github页面提供了我在这里复制的路由器的示例:
enum Router: URLRequestConvertible {
static let baseURLString = "http://example.com"
static var OAuthToken: String?
case createuser([String: AnyObject])
case ReadUser(String)
case UpdateUser(String,[String: AnyObject])
case DestroyUser(String)
var method: Alamofire.Method {
switch self {
case .createuser:
return .POST
case .ReadUser:
return .GET
case .UpdateUser:
return .PUT
case .DestroyUser:
return .DELETE
}
}
var path: String {
switch self {
case .createuser:
return "/users"
case .ReadUser(let username):
return "/users/\(username)"
case .UpdateUser(let username,_):
return "/users/\(username)"
case .DestroyUser(let username):
return "/users/\(username)"
}
}
// MARK: URLRequestConvertible
var URLRequest: NSURLRequest {
let URL = NSURL(string: Router.baseURLString)!
let mutableuRLRequest = NSMutableuRLRequest(URL: URL.URLByAppendingPathComponent(path))
mutableuRLRequest.HTTPMethod = method.rawValue
if let token = Router.OAuthToken {
mutableuRLRequest.setValue("Bearer \(token)",forHTTPHeaderField: "Authorization")
}
switch self {
case .createuser(let parameters):
return Alamofire.ParameterEncoding.JSON.encode(mutableuRLRequest,parameters: parameters).0
case .UpdateUser(_,let parameters):
return Alamofire.ParameterEncoding.URL.encode(mutableuRLRequest,parameters: parameters).0
default:
return mutableuRLRequest
}
}
}
当我看这个(我是新的快速,所以请忍受> _<)我看到一个用户对象的操作;他们正在创建一个用户,更新一个用户等...所以,如果我有模型对象的人,公司,位置在我的模型层,我会为每个模型对象创建一个路由器? 2)当与API进行重大交互时,我习惯于创建一个“网络管理器”单例来抽象出网络层,并保留该标头和该API的基础。该alamofire有一个这里描述的“经理”:
Top-level convenience methods like Alamofire.request use a shared instance of Alamofire.Manager,which is configured with the default NSURLSessionConfiguration. As such,the following two statements are equivalent:
Alamofire.request(.GET,"http://httpbin.org/get") let manager = Alamofire.Manager.sharedInstance manager.request(NSURLRequest(URL: NSURL(string: "http://httpbin.org/get")))
这个经理我应该用什么作为我的单身?如果是这样,我该如何设置经理的基础?此外,如果我使用这个管理器/ /这可以与上面显示的路由器结构一起工作(每个模型对象设置为baseurl和NSURLRquest)?如果可以提供一个简单的例子呢?
我是Alamofire图书馆的新手,迅速。所以,我知道我的理解有很多洞,但我只是想了解最好的,我可以!任何信息有帮助。谢谢。
Do I create an enum router which implements URLRequestConvertible for each model in my model layer?
这是一个很好的问题,不幸的是没有一个完美的答案。有一些方法可以扩展路由器模式以适应多种对象类型。第一个选项是添加更多的案例来支持另一个对象类型。然而,当您获得超过6或7例的情况下,这很快就会变得很快。您的开关语句刚刚开始失控。因此,我不会推荐这种方法。
解决问题的另一种方法是将泛型引入到路由器中。
路由器对象协议
protocol RouterObject {
func createObjectPath() -> String
func readobjectPath(identifier: String) -> String
func updateObjectPath(identifier: String) -> String
func destroyObjectPath(identifier: String) -> String
}
模型对象
struct User: RouterObject {
let rootPath = "/users"
func createObjectPath() -> String { return rootPath }
func readobjectPath(identifier: String) -> String { return "\(rootPath)/\(identifier)" }
func updateObjectPath(identifier: String) -> String { return "\(rootPath)/\(identifier)" }
func destroyObjectPath(identifier: String) -> String { return "\(rootPath)/\(identifier)" }
}
struct Company: RouterObject {
let rootPath = "/companies"
func createObjectPath() -> String { return rootPath }
func readobjectPath(identifier: String) -> String { return "\(rootPath)/\(identifier)" }
func updateObjectPath(identifier: String) -> String { return "\(rootPath)/\(identifier)" }
func destroyObjectPath(identifier: String) -> String { return "\(rootPath)/\(identifier)" }
}
struct Location: RouterObject {
let rootPath = "/locations"
func createObjectPath() -> String { return rootPath }
func readobjectPath(identifier: String) -> String { return "\(rootPath)/\(identifier)" }
func updateObjectPath(identifier: String) -> String { return "\(rootPath)/\(identifier)" }
func destroyObjectPath(identifier: String) -> String { return "\(rootPath)/\(identifier)" }
}
路由器
let baseURLString = "http://example.com"
var OAuthToken: String?
enum Router<T where T: RouterObject>: URLRequestConvertible {
case CreateObject(T,[String: AnyObject])
case Readobject(T,String)
case UpdateObject(T,String,[String: AnyObject])
case DestroyObject(T,String)
var method: Alamofire.Method {
switch self {
case .CreateObject:
return .POST
case .Readobject:
return .GET
case .UpdateObject:
return .PUT
case .DestroyObject:
return .DELETE
}
}
var path: String {
switch self {
case .CreateObject(let object,_):
return object.createObjectPath()
case .Readobject(let object,let identifier):
return object.readobjectPath(identifier)
case .UpdateObject(let object,let identifier,_):
return object.updateObjectPath(identifier)
case .DestroyObject(let object,let identifier):
return object.destroyObjectPath(identifier)
}
}
// MARK: URLRequestConvertible
var URLRequest: NSMutableuRLRequest {
let URL = NSURL(string: baseURLString)!
let mutableuRLRequest = NSMutableuRLRequest(URL: URL.URLByAppendingPathComponent(path))
mutableuRLRequest.HTTPMethod = method.rawValue
if let token = OAuthToken {
mutableuRLRequest.setValue("Bearer \(token)",forHTTPHeaderField: "Authorization")
}
switch self {
case .CreateObject(_,let parameters):
return Alamofire.ParameterEncoding.JSON.encode(mutableuRLRequest,parameters: parameters).0
case .UpdateObject(_,_,parameters: parameters).0
default:
return mutableuRLRequest
}
}
}
使用示例
func exampleUsage() {
let URLRequest = Router.CreateObject(Location(),["address": "1234 Road of Awesomeness"]).URLRequest
Alamofire.request(URLRequest)
.response { request,response,data,error in
print(request)
print(response)
print(data)
print(error)
}
}
现在您必须在这里做出一些折衷。首先,您的模型对象需要符合RouterObject协议。否则路由器不知道该用于路径。此外,您需要确保所有路径都可以使用单个标识符构建。如果不能,这种设计可能不起作用。最后一个问题是您无法直接在Router enum中存储baseURL或OAuthToken。不幸的是,通用枚举中不支持静态和存储的属性。
无论如何,这绝对是避免为每个模型对象创建路由器的有效方法。
Should the
Alamofire.Manager.sharedInstancebe used as my singletonNetworkManagerinstance?
它当然可以以这种方式使用。这真的取决于您的用例和您如何设计网络访问。它还取决于需要多少种不同类型的会话。如果您需要后台会话和默认会话,那么您可能仍然需要包含每个自定义管理器实例的NetworkManager的概念。但是,如果您只是使用默认会话触发网络,那么sharedInstance可能就足够了。
How Could the
baseURLof theAlamofiresingleton be used in conjunction with theRouterpattern?
好的问题…下面的代码是一个如何做到的例子。
Alamofire经理扩展
extension Manager {
static let baseURLString = "http://example.com"
static var OAuthToken: String?
}
路由器URLRequestConvertible更新
var URLRequest: NSMutableuRLRequest {
let URL = NSURL(string: Alamofire.Manager.baseURLString)!
let mutableuRLRequest = NSMutableuRLRequest(URL: URL.URLByAppendingPathComponent(path))
mutableuRLRequest.HTTPMethod = method.rawValue
if let token = Alamofire.Manager.OAuthToken {
mutableuRLRequest.setValue("Bearer \(token)",forHTTPHeaderField: "Authorization")
}
switch self {
case .CreateObject(_,let parameters):
return Alamofire.ParameterEncoding.JSON.encode(mutableuRLRequest,parameters: parameters).0
case .UpdateObject(_,let parameters):
return Alamofire.ParameterEncoding.URL.encode(mutableuRLRequest,parameters: parameters).0
default:
return mutableuRLRequest
}
}
希望这有助于减轻光线。祝你好运!