Module: BubbleWrap::KVO

Defined in:
motion/core/kvo.rb

Defined Under Namespace

Classes: Registry

Constant Summary collapse

DEFAULT_OPTIONS =
NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld
IMMIDEATE_OPTIONS =
NSKeyValueObservingOptionNew | NSKeyValueObservingOptionInitial

Instance Method Summary collapse

Instance Method Details

#observe(target = self, key_paths, &block) ⇒ Object



103
104
105
106
107
108
109
110
111
112
113
114
# File 'motion/core/kvo.rb', line 103

def observe(target = self, key_paths, &block)
  key_paths = [key_paths].flatten

  key_paths.each do |key_path|
    if not observers_registry.registered?(target, key_path)
      target.addObserver(observers_registry, forKeyPath:key_path, options:DEFAULT_OPTIONS, context:nil)
    end

    # Add block even if observer is registed, so multiplie blocks can be invoked.
    observers_registry.add(target, key_path, &block)
  end
end

#observe!(target = self, key_paths, &block) ⇒ Object



116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
# File 'motion/core/kvo.rb', line 116

def observe!(target = self, key_paths, &block)
  key_paths = [key_paths].flatten

  key_paths.each do |key_path|
    registered = immediate_observers_registry.registered?(target, key_path)

    immediate_observers_registry.add(target, key_path, &block)

    # We need to first register the block, and then call addObserver, because
    # observeValueForKeyPath will fire immedeately.
    if not registered
      target.addObserver(immediate_observers_registry, forKeyPath:key_path, options: IMMIDEATE_OPTIONS, context:nil)
    end
  end
end

#unobserve(target = self, key_paths) ⇒ Object



132
133
134
# File 'motion/core/kvo.rb', line 132

def unobserve(target = self, key_paths)
  remove_from_registry_if_exists(target, key_paths, observers_registry)
end

#unobserve!(target = self, key_paths) ⇒ Object



136
137
138
# File 'motion/core/kvo.rb', line 136

def unobserve!(target = self, key_paths)
  remove_from_registry_if_exists(target, key_paths, immediate_observers_registry)
end

#unobserve_allObject



140
141
142
143
144
145
146
147
148
149
150
151
# File 'motion/core/kvo.rb', line 140

def unobserve_all
  observers_registry.each_key_path do |target, key_path|
    target.removeObserver(observers_registry, forKeyPath:key_path)
  end

  immediate_observers_registry.each_key_path do |target, key_path|
    target.removeObserver(immediate_observers_registry, forKeyPath:key_path)
  end

  observers_registry.remove_all
  immediate_observers_registry.remove_all
end