Конфигурация сиесты "самостоятельно захвачена ошибкой закрытия" - PullRequest
0 голосов
/ 16 мая 2018

Я использую фреймворк Siesta и пытаюсь добавить декоратор для обновления токена, когда он истекает, но я получаю: 'self захвачено замыканием до инициализации всех участников'.

В чем может быть причина?

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

UPDATE

Я нашел свою проблему и хотел поделиться ею с вами. Проблема связана с услугами, которые были свойствами класса:

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

}

Ответы [ 2 ]

0 голосов
/ 16 мая 2018

Сообщение об ошибке говорит вам, в чем проблема:

ошибка: 'self' захвачено закрытием до инициализации всех членов

Вы пытаетесь захватить 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
0 голосов
/ 16 мая 2018

Вы можете добавить [unowned self] в начале закрытия таким образом, чтобы закрытие не сохранялось. Пожалуйста, попробуйте [weak self ] также

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...