Вызвать метод один раз только на время жизни объекта в Swift

Допустим, мы переопределяем метод scrollViewDidScroll и для первой прокрутки только мы хотим doSomething()

Тривиальный способ реализовать это - иметь логическую переменную уровня экземпляра и переключать / проверять ее.

func scrollViewDidScroll(scrollView: UIScrollView!) {
  if(!scrolled) {
   scrolled = true; 
   doSomething(); 
  }
}

Мне нужно лучшее решение, которое не вводит логическую переменную scrolled. Что-то похожее на dispatch_once, но на время жизни объекта, а не всего процесса.

Есть ли название у этого паттерна?


person zakishaheen    schedule 19.08.2016    source источник
comment
Почему это отклоняется? Это ясный вопрос, задающий правильный вопрос.   -  person rmaddy    schedule 20.08.2016


Ответы (2)


Что-то похожее на dispatch_once, но на время жизни объекта, а не всего процесса

К сожалению, dispatch_once небезопасен на уровне экземпляра. Люди, которые используют это в Objective-C, ошибаются. Вот почему dispatch_once недоступен в Swift.

Фактически, ваш шаблон if !scrolled является правильной реализацией (за исключением использования скобок, точек с запятой и других вещей, не относящихся к Swifty). Это называется флаг.

person matt    schedule 19.08.2016
comment
Спасибо. На самом деле я пытаюсь избежать проблемы, связанной с тем, что кто-то другой перепрофилирует логическое значение в какой-то другой области класса, тем самым испортив мою реализацию. Например. скажем, я пытаюсь вызвать аналитику по этому поводу - кто-то другой может делать что-то, связанное со скрытым представлением заголовка или чем-то еще - и повторно использует bool. Проблема обнаружится довольно поздно. Лучший способ - вообще избежать логического значения, не так ли? - person zakishaheen; 20.08.2016
comment
@zakishaheen: См. также ответ stackoverflow.com/a/19845164/1187415 от инженера Apple Грега Паркера. - person Martin R; 21.08.2016
comment
И здесь есть интересное обсуждение github.com/apple/swift-corelibs -libdispatch / pull / - person matt; 21.08.2016

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

Если это правильно и тривиально, почему, как вы думаете, есть способ лучше?

person rmaddy    schedule 19.08.2016
comment
Я думаю, это добавляет к «состоянию» объекта. Я пытаюсь этого избежать. Я не хочу, чтобы кто-то еще пытался перенаправить логическую переменную для решения какой-либо другой проблемы, создавая тем самым проблемы для моего решения позже. - person zakishaheen; 20.08.2016
comment
1) Отслеживание состояния объекта - это именно то, для чего нужны переменные экземпляра. 2) О ком еще ты говоришь? Сделайте ее частной переменной экземпляра (или частной собственностью), и никто другой не сможет изменить ее назначение. - person rmaddy; 20.08.2016
comment
Под кем-то другим я подразумеваю другого разработчика, работающего над тем же классом когда-нибудь позже. - person zakishaheen; 20.08.2016
comment
Вот для чего нужны комментарии. Вот почему переменные должны иметь хорошие описательные имена. Вы уже потратили больше времени, пытаясь найти какое-то мистическое, гораздо более сложное решение тривиальной проблемы, чем вы когда-либо потратите в будущем, из-за того, что какой-то другой разработчик ошибочно использовал вашу переменную экземпляра. - person rmaddy; 20.08.2016