module BubbleWrap::KVO

Constants

DEFAULT_OPTIONS
IMMIDEATE_OPTIONS

Public Instance Methods

observe(target = self, key_paths, &block) click to toggle source
# 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) click to toggle source
# 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) click to toggle source
# 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) click to toggle source
# 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_all() click to toggle source
# 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

Private Instance Methods

immediate_observers_registry() click to toggle source
# File motion/core/kvo.rb, line 158
def immediate_observers_registry
  @immediate_observers_registry ||= Registry.new([:new])
end
observers_registry() click to toggle source
# File motion/core/kvo.rb, line 154
def observers_registry
  @observers_registry ||= Registry.new
end
remove_from_registry_if_exists(target, key_paths, registry) click to toggle source
# File motion/core/kvo.rb, line 162
def remove_from_registry_if_exists(target, key_paths, registry)
  key_paths = [key_paths].flatten

  key_paths.each do |key_path|
    if registry.registered?(target, key_path)
      target.removeObserver(registry, forKeyPath:key_path)
      registry.remove(target, key_path)
    end
  end
end