swift – Singleton模式和正确使用Alamofire的URLRequestConvertible

swift – Singleton模式和正确使用Alamofire的URLRequestConvertible,第1张

概述这是一个2部分的问题,第一个类似于这个问题在这里: Proper usage of the Alamofire’s URLRequestConvertible.但我需要一点帮助! 1)我创建一个枚举路由器,为我的模型层中的每个模型实现URLRequestConvertible? alamofire github页面提供了我在这里复制的路由器的示例: enum Router: URLRequestC 这是一个2部分的问题,第一个类似于这个问题在这里: Proper usage of the Alamofire’s URLRequestConvertible.但我需要一点帮助!

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.sharedInstancemanager.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.sharedInstance be used as my singleton NetworkManager instance?

它当然可以以这种方式使用。这真的取决于您的用例和您如何设计网络访问。它还取决于需要多少种不同类型的会话。如果您需要后台会话和默认会话,那么您可能仍然需要包含每个自定义管理器实例的NetworkManager的概念。但是,如果您只是使用默认会话触发网络,那么sharedInstance可能就足够了。

How @R_404_5717@ the baseURL of the Alamofire singleton be used in conjunction with the Router pattern?

好的问题…下面的代码是一个如何做到的例子。

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    }}

希望这有助于减轻光线。祝你好运!

总结

以上是内存溢出为你收集整理的swift – Singleton模式和正确使用Alamofire的URLRequestConvertible全部内容,希望文章能够帮你解决swift – Singleton模式和正确使用Alamofire的URLRequestConvertible所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1053223.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-25
下一篇 2022-05-25

发表评论

登录后才能评论

评论列表(0条)

保存