0

我正在使用 Siesta 框架并尝试添加装饰器以在令牌过期时刷新令牌,但我得到:'在所有成员初始化之前被闭包捕获'。

可能是什么原因?

service.configure("**") {
      $0.decorateRequests {
      self.refreshTokenOnAuthFailure(request: $1) // this line complains
    }
}

更新

我发现了我的问题,想和你分享。问题与属于类属性的服务有关:

class API: NSObject {

 private let service = Service(
    baseURL: myApiBaseUrl,
    standardTransformers: [.text, .json]
)

override init() {
    #if DEBUG
        // Bare-bones logging of which network calls Siesta makes:
        LogCategory.enabled = [.network]
    #endif

    service.configure("**") {

       $0.headers["Token"] = "Bearer \(token)"
       $0.headers["Content-Type"] = "application/json"
       $0.headers["Accept"] = "application/json"

       $0.decorateRequests {
        self.refreshTokenOnAuthFailure(request: $1)
       }
    }

}

我没有使用类属性,而是将我的服务移到了类之外并添加了一个指定的初始化程序。

init(myService:Service){
    super.init()

    myService.configure("**") {

        $0.headers["Token"] = "Bearer \(token)"
        $0.headers["Content-Type"] = "application/json"
        $0.headers["Accept"] = "application/json"

        $0.decorateRequests {
            self.refreshTokenOnAuthFailure(request: $1)
        }
    }

}
4

2 回答 2

1

您可能想[unowned self] 在闭包的开头添加这样的闭包不保留。[weak self ]请也试试

于 2018-05-16T12:49:15.267 回答
0

错误消息告诉您问题所在:

错误:在所有成员初始化之前由闭包捕获的“自我”

您正在尝试self在所有成员初始化之前捕获。考虑以下两个示例,一个显示您遇到的错误,另一个没有。

您的错误示例

class Customer {

    var someProperty: String
    var someArray: [Int] = [1,2,3]

    init() {

        someArray.forEach {
            print("\($0): \(self.someProperty)") // Error: 'self' captured before initializing 'someProperty'
        }

        someProperty = "Potato"
    }
}

_ = Customer()

解决方案

class Customer {

    var someProperty: String
    var someArray: [Int] = [1,2,3]

    init() {

        someProperty = "Potato"

        someArray.forEach {
            print("\($0): \(self.someProperty)") // Good, 'someProperty' has been initialized already
        }
    }
}

_ = Customer()


// Output:
//
// 1: Potato
// 2: Potato
// 3: Potato
于 2018-05-16T13:53:24.103 回答