Swift Observer (KVO): проверка на существование - PullRequest
0 голосов
/ 11 сентября 2018

У меня есть ящик, который пользователь может перемещать. Для этого я добавляю наблюдателя, чтобы проверить, изменился ли его центр:

self.boxView!.addObserver(self, forKeyPath: "center", options: .old, context: &BoxCenterContext)

Это добавляется после анимации, которая представляет коробку.

Когда ящик закрывается, я удаляю его так:

self.boxView!.removeObserver(self, forKeyPath: "center", context: &BoxCenterContext)

Выпуск

Существует возможность того, что пользователь сможет отклонить ящик до завершения представления ящика, т.е. перед добавлением КВО.

Когда это происходит, приложение падает, пытаясь удалить KVO, который не существует.

Вопрос

Есть ли способ проверить наличие КВО (перед попыткой удаления)?

Ответы [ 2 ]

0 голосов
/ 11 сентября 2018

Apple не предоставляет API для проверки существования наблюдателя, но вы можете управлять флагом Bool для этого. Например, когда вы регистрируете KVO, вы устанавливаете для isObserver bool значение true, а затем перед удалением наблюдателя необходимо проверить isObserver на true, равный false, если isObserver равен true, поэтому удалите наблюдатель, а если он равен false, ничего не делайте.

0 голосов
/ 11 сентября 2018

observationInfo свойство устанавливается при добавлении наблюдателя

if self.boxView!.observationInfo != nil {

   self.boxView!.removeObserver(self, forKeyPath: "center", context: &BoxCenterContext) 
}
...