如何使用 DVR 会话初始化 Alamofire 管理器?

Posted

技术标签:

【中文标题】如何使用 DVR 会话初始化 Alamofire 管理器?【英文标题】:How can I initialize an Alamofire Manager with a DVR Session? 【发布时间】:2016-03-25 21:45:45 【问题描述】:

我想用DVR Session 初始化Alamofire Manager,以便记录和回放网络请求以进行测试。当Manager's initializer 访问Session 的委托时,它会抛出unrecognized selector 异常。如果有人同时使用AlamofireDVR,可以分享一下你的初始化代码吗?

这是我所拥有的:

let api: OurAPI

let maybeSession = dvrCassetteName.flatMap cassetteName -> Session? in
    let delegate = Manager.SessionDelegate()
    let backingSession = NSURLSession(configuration: NSURLSessionConfiguration.defaultSessionConfiguration(), delegate: delegate, delegateQueue: nil)
    let maybeBundle = NSBundle.allBundles().filter $0.bundlePath.lowercaseString.containsString("xctest") .first
    if let bundle = maybeBundle 
        let session = Session(outputDirectory: "~/Desktop/DVR/", cassetteName: cassetteName, testBundle: bundle, backingSession: backingSession)
        return session
     else 
        return nil
    


if let session = maybeSession, manager = Alamofire.Manager(session: session, delegate: Manager.SessionDelegate()) 
    api = OurAPI(manager: manager)
 else 
    api = OurAPI()

Here's the PR 在 Alamofire 上介绍了我正在使用的初始化程序,在讨论中他们讨论了我的用例,但没有提到 unrecognized selector。我也尝试过分叉DVR 并覆盖delegate 以指向backingSession.delegate,但仍然出现异常。

【问题讨论】:

【参考方案1】:

来自 Alamofire.Manager 的失败初始化是这一行的罪魁祸首:https://github.com/Alamofire/Alamofire/blob/master/Source/Manager.swift#L171

问题是我们不能直接在会话上设置委托,因为它是一个 get-only 属性。

为了解决这个问题,我必须做以下事情:

class RecordSession: Session 
    override var delegate: NSURLSessionDelegate? 
        get 
            return backingSession.delegate
        
    

我很确定我还没有陷入困境,但这至少让我们解决了这个问题。

【讨论】:

以上是关于如何使用 DVR 会话初始化 Alamofire 管理器?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我不能初始化 Alamofire 4 会话管理器?

如何使用 Alamofire 和会话管理器附加 MultipartFormData 以及其他帖子参数? [复制]

在 Alamofire 4.0 中初始化 SessionManager

如何使用 Alamofire 关闭证书验证?

Alamofire 会话配置未反映在请求中

为啥不建议在 Alamofire 中修改授权标头的会话配置?