2016-12-02 136 views
1

我一直在迁移我的项目到swift3并一直在争取让Alamofire RequestRetrier协议工作。我按照Alamofire 4.0迁移指南: https://github.com/Alamofire/Alamofire/blob/master/Documentation/Alamofire%204.0%20Migration%20Guide.md#request-retrier类不符合协议RequestRetrier

这是我想打造类:

import Foundation 
import Alamofire 

class RequestAccessTokenAdapter: RequestAdapter, RequestRetrier { 
    private let accessToken: String 

    init(accessToken: String) { 
     self.accessToken = accessToken 
    } 

    func adapt(_ urlRequest: URLRequest) throws -> URLRequest { 
     var urlRequest = urlRequest 

     if (urlRequest.url?.absoluteString.hasPrefix(MyServer.serverUrl()))! { 
      urlRequest.setValue("Bearer " + accessToken, forHTTPHeaderField: "Authorization") 
     } 

     return urlRequest 
    } 

    func should(_ manager: SessionManager, retry request: Request, with error: Error, completion: @escaping RequestRetryCompletion) { 
     if let response = request.task?.response as? HTTPURLResponse, response.statusCode == 401 { 
      completion(true, 1.0) // retry after 1 second 
     } else { 
      completion(false, 0.0) // don't retry 
     } 
    } 

} 

大厦失败,出现以下错误:类型“RequestAccessTokenAdapter”不符合协议“ RequestRetrier”

我一直在试图与这两个Alamofire 4.2.0 & AlamofireObjectMapper 4.0.1,并与Alamofire 4.0.1 & AlamofireObjectMapper 4.0.0,但我一直GET同样的错误。

如果我只使用RequestAdapter协议并删除should-function,那么一切都会建立好,但我似乎无法获得构建的RequestRetrier,这对我的项目也是需要的。

任何想法,我从我的课缺少什么?

编辑:

我似乎有一个命名空间的问题,因为代码构建成功我应该函数的定义替换错误与Swift.Error后:

func should(_ manager: SessionManager, retry request: Request, with error: Swift.Error, completion: @escaping RequestRetryCompletion) { 

回答

3

我也被看到同样的问题。看完Alamofire源代码后,我发现XCode为should方法自动生成无效的方法签名。通过明确地将Alamofire模块名称添加到SessionManager,RequestRequestRetryCompletion类型声明中,在should方法的参数列表中,我终于能够获得它。所以,你should方法应该是这个样子:

func should(_ manager:  Alamofire.SessionManager, 
      retry request: Alamofire.Request, 
      with error:  Error, 
      completion:  @escaping Alamofire.RequestRetryCompletion) { 

    // Do something 

} 

我希望这有助于!

+1

谢谢你的回答。它部分帮助我解决了我的问题。我可能会遇到某种名称空间冲突,但是当我将Swift.Error替换为Error时,我的代码生成成功了。 – liitokone

相关问题