Sha256: a240abd9dbf84df3fac8d0b37e7913077933cb43dcbec88bc225518ca757e48f

Contents?: true

Size: 1.19 KB

Versions: 4

Compression:

Stored size: 1.19 KB

Contents

module Elevate
  class Dispatcher
    def initialize
      @on_finished = nil
      @on_started = nil
    end

    def dispose
      return if @on_started.nil? && @on_finished.nil?

      # Callbacks must be released on the main thread, because they may contain a strong
      # reference to a UIKit component. See "The Deallocation Problem" for more info.
      unless NSThread.isMainThread
        self.performSelectorOnMainThread(:dispose, withObject: nil, waitUntilDone: true)
        return
      end

      @on_started = nil
      @on_finished = nil
    end

    def invoke_finished_callback
      invoke(:@on_finished)
    end

    def on_finished=(callback)
      @on_finished = callback
    end

    def on_started=(callback)
      @on_started = callback

      Dispatch::Queue.main.async do
        invoke(:@on_started)
      end
    end

    private

    def invoke(callback_name)
      unless NSThread.isMainThread
        self.performSelectorOnMainThread(:"invoke:", withObject: callback_name, waitUntilDone: true)
        return
      end

      if callback = instance_variable_get(callback_name)
        callback.call()

        instance_variable_set(callback_name, nil)
      end
    end
  end
end

Version data entries

4 entries across 4 versions & 1 rubygems

Version Path
elevate-0.3.3 lib/elevate/dispatcher.rb
elevate-0.3.2 lib/elevate/dispatcher.rb
elevate-0.3.1 lib/elevate/dispatcher.rb
elevate-0.3 lib/elevate/dispatcher.rb