Swift   发布时间:2022-03-31  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了swift – Singleton模式和正确使用Alamofire的URLRequestConvertible大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

概述

这是一个2部分的问题,第一个类似于这个问题在这里: Proper usage of the Alamofire’s URLrequestConvertible.但我需要一点帮助! 1)我创建一个枚举路由器,为我的模型层中的每个模型实现URLrequestConvertible? alamofire github页面提供了我在这里复制的路由器的示例: enum Router: URLrequestC@H_450_5@
这是一个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 .@R_673_9421@E
        }
    }

    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.httpR_166_11845@ethod = 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有一个这里描述的“经理”:

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图书馆的新手,迅速。所以,我知道我的理解有很多洞,但我只是想了解最好的,我可以!任何信息有帮助。谢谢。

这些是一些非常好的问题。让我试图依次回答每一个

这是一个很好的问题,不幸的是没有一个完美的答案。有一些方法可以扩展路由器模式以适应多种对象类型。第一个选项是添加更多的案例来支持一个对象类型。然而,当您获得超过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 .@R_673_9421@E
        }
    }

    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.httpR_166_11845@ethod = 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。不幸的是,通用枚举中不支持静态和存储的属性

无论如何,这绝对是避免为每个模型对象创建路由器的有效方法

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

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

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.httpR_166_11845@ethod = 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所遇到的程序开发问题。

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

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。