Sha256: 0df645f3066f7189094850f0d8b9198fb7fd47ff9aea5cea3a50508c1dc18caa

Contents?: true

Size: 1.84 KB

Versions: 1

Compression:

Stored size: 1.84 KB

Contents

module MotionBindable::StrategyHelpers
  # A generic method for observing an object's attribute that is
  # being bound to.
  #
  # Where strategies deal with observing a large variety of possible bound
  # objects, this method will only have to worry about a small set of possible
  # objects being binded to, KVO should actually cover most cases.
  def observe_object(&block)
    @_observe_object_cb = block

    if defined?(MotionModel::Model) && object.is_a?(MotionModel::Model)
      @_observe_object_mode = :motion_model
      start_observing_motion_model
    else
      @_observe_object_mode = :kvo
      start_observing_kvo
    end
  end

  def stop_observe_object
    case @_observe_object_mode
    when :kvo then stop_observing_kvo
    end

    @_observe_object_mode,
    @_observe_object_block = nil
  end

  # NSKeyValueObserving Protocol

  def observeValueForKeyPath(_, ofObject: _, change: change, context: _)
    @_observe_object_cb.call(change[:old], change[:new])
  end

  private

  def start_observing_motion_model
    @_observe_object_old_value = object.send(attr_name)
    NSNotificationCenter.defaultCenter.addObserverForName(
      'MotionModelDataDidChangeNotification',
      object: object,
      queue: nil,
      usingBlock: proc do |notification|
        new = notification.object.send(attr_name)
        @_observe_object_cb.call(
          @_observe_object_old_value,
          new
        ) if @_observe_object_cb
        @_observe_object_old_value = new
      end
    )
  end

  def start_observing_kvo
    object.addObserver(
      self,
      forKeyPath: attr_name,
      options: NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld,
      context: nil
    )
  end

  def stop_observing_kvo
    object.removeObserver(
      self,
      forKeyPath: attr_name
    )
  rescue
    # See: http://nshipster.com/key-value-observing/
    true
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
motion_bindable-0.3.0 lib/motion_bindable/strategy_helpers.rb