Конфигурация Siesta "зафиксирована ошибкой закрытия"

Я использую фреймворк 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)
        }
    }

}

person Ugur    schedule 16.05.2018    source источник


Ответы (2)


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

person Kunal_D    schedule 16.05.2018
comment
Спасибо за ваш вклад. Не могли бы вы включить это в код OP, чтобы показать, как это применяется. - person RandomSort; 16.05.2018
comment
Замечательно, если вы сейчас отредактируете свой ответ, я бы с удовольствием проголосовал за него :) - person RandomSort; 16.05.2018
comment
Kunal, когда я добавляю [self unowned], он использует неразрешенный идентификатор для unowned - person Ugur; 16.05.2018
comment
Я попробовал это, и он выдает ту же ошибку, что и я: $ 0.decorateRequests {[unowned self] rep, req in self.refreshTokenOnAuthFailure (request: req)} - person Ugur; 16.05.2018
comment
Спасибо, Кунал, то, что вы предложили, сработало после того, как я создал собственный init, но теперь у меня другая проблема, связанная с Siesta. - person Ugur; 16.05.2018
comment
@RandomSort Я понял свою ошибку и исправил ее, спасибо. Приятно познакомиться ???? - person Kunal_D; 16.05.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
person R.B.    schedule 16.05.2018