2016-02-01 4 views
1

С моей точки зрения, поскольку я не использую отдельный поток для моего KVO (observValueForKeyPath в Swift), когда значение, которое я наблюдаю за изменениями, будет вызываться с помощью watchValueForKeyPath() с тем же потоком. Я не уверен, что я говорю о том, что я нахожусь в середине watchValueForKeyPath(), после чего значение снова изменится, что произойдет? Прервется ли мое текущее исполнение, и я снова начну с начала watchValueForKeyPath()? В этом случае, вернитесь к прерванному предыдущему методу наблюденияValueForKeyPath() после завершения последнего наблюденияValueForKeyPath()? В этом случае, я полагаю, это вызывает условие гонки, если я манипулирую данными в watchValueForKeyPath(). Спасибо.Если значение, наблюдаемое KVO, изменяется за короткое время дважды, что произойдет в watchValueForKeyPath()?

ответ

1

KVO действительно классный. То, что на самом деле происходит (как найдено mike ash), заключается в том, что среда выполнения будет подклассифицировать ваш объект и переопределить сеттер для объекта, который наблюдается. У переопределенного сеттера есть дополнительные инструкции, которые в конечном счете явно вызовут -observeValueForKey для , наблюдая за объектом.

Так что же происходит, если вы измените значение по указанному ключевого пути из в-observeValueForKey, вы будете просто в конечном итоге с -observeValueForKey сообщения, посылаемого на наблюдали (тот же) объект. Итак, как вы говорите, ваше текущее исполнение будет прервано, несколько стеков кадров, связанных с KVO, будут помещены в ваш стек вызовов, и если все будет исправлено правильно, вы продолжите, как обычно.

Конечно, вещь, которая должна быть утомлена, заключается в том, что внутри объекта -observeValueForKey для объекта, которого вы всегда, отправляет уведомление об этом же объекте. Вы окажетесь в бесконечном цикле, и ваше приложение выйдет из строя.

И я бы не стал называть то, что вы описываете как условие гонки, потому что ни в коем случае не два объекта, пытающихся одновременно прочитать/записать объект. Вам просто нужно утомиться от заказа, в котором вы читаете и пишете, поскольку это может быть и не так, как вы ожидаете

+0

@A О, вы правы, это не состояние гонки. Это просто, предположим, что в watchValueForKey у меня есть двойной массив, который я хочу манипулировать, и пока я не закончил манипулировать ими, возможно, произойдет другое наблюдение за ValueForKey. И это приведет к тому, что значения будут некорректными в конце. Эта проблема будет правильной? – g10000

+0

Исправить. Вам просто нужно убедиться, что вы не начинаете уведомления KVO внутри вашего '-observeValueForKey', если вы явно не хотели этого делать. Способ обойти это состоит в том, чтобы установить поддержку 'ivar' (например,' _myProperty') вместо вызова синтезированного сеттера (например, 'self.myProperty'). Установив «ivar» прямо, вы обойдете этот переопределенный сеттер, среда выполнения генерирует, чтобы вызывать уведомления KVO –

 Смежные вопросы

  • Нет связанных вопросов^_^