[MacRuby-devel] How to retrieve an observer's context?

2009-04-20 Thread Edward Hynes
I'd like to use contexts when registering some observers, but have  
been unable to retrieve them, getting a can't convert C/Objective-C  
value `0x2822731' of type `v' to Ruby object instead.  The following  
code, for example, will trigger the error


class Subject
  attr_accessor :abc
end

class Observer
  def observeValueForKeyPath keyPath, ofObject:object, change:change,  
context:context

context[0]
  end
end

subject = Subject.new
observer = Observer.new

subject.addObserver observer, forKeyPath:'abc', options:0, context:'a  
context'

subject.setAbc 'some value'

Is there a way to retrieve an observation context?  Or is there an  
alternative way for observers to distinguish among multiple  
registrations for a given object/keyPath?



Thanks,
Ed

___
MacRuby-devel mailing list
MacRuby-devel@lists.macosforge.org
http://lists.macosforge.org/mailman/listinfo.cgi/macruby-devel


Re: [MacRuby-devel] How to retrieve an observer's context?

2009-04-20 Thread Laurent Sansonetti

Hi Edward,

Context arguments in Objective-C are generally void pointers, which  
makes them hard to use in Ruby. Also, since we run in Objective-C GC  
mode, objects could potentially be collected since contexts do not set  
up AFAIK write barriers.


I would recommend to set up an instance variable on your observer  
instead (and pass nil as the context).


  observer.instance_variable_set(:@context, your_context)

And later in your observer method, retrieve the ivar.

Laurent

On Apr 20, 2009, at 8:57 AM, Edward Hynes wrote:

I'd like to use contexts when registering some observers, but have  
been unable to retrieve them, getting a can't convert C/Objective-C  
value `0x2822731' of type `v' to Ruby object instead.  The  
following code, for example, will trigger the error


class Subject
 attr_accessor :abc
end

class Observer
 def observeValueForKeyPath keyPath, ofObject:object, change:change,  
context:context

   context[0]
 end
end

subject = Subject.new
observer = Observer.new

subject.addObserver observer, forKeyPath:'abc', options:0,  
context:'a context'

subject.setAbc 'some value'

Is there a way to retrieve an observation context?  Or is there an  
alternative way for observers to distinguish among multiple  
registrations for a given object/keyPath?


Thanks,
Ed

___
MacRuby-devel mailing list
MacRuby-devel@lists.macosforge.org
http://lists.macosforge.org/mailman/listinfo.cgi/macruby-devel


___
MacRuby-devel mailing list
MacRuby-devel@lists.macosforge.org
http://lists.macosforge.org/mailman/listinfo.cgi/macruby-devel


Re: [MacRuby-devel] How to retrieve an observer's context?

2009-04-20 Thread Edward Hynes

Hi Laurent,

Thanks for the help.  Did you mean to set the context ivar on the  
observer or on the subject?  Wouldn't setting it on the observer  
result in the last registration 'winning' if the observer is watching  
more than one subject?


Ed

On Apr 20, 2009, at 4:28 PM, Laurent Sansonetti wrote:


Hi Edward,

Context arguments in Objective-C are generally void pointers, which  
makes them hard to use in Ruby. Also, since we run in Objective-C GC  
mode, objects could potentially be collected since contexts do not  
set up AFAIK write barriers.


I would recommend to set up an instance variable on your observer  
instead (and pass nil as the context).


 observer.instance_variable_set(:@context, your_context)

And later in your observer method, retrieve the ivar.

Laurent


___
MacRuby-devel mailing list
MacRuby-devel@lists.macosforge.org
http://lists.macosforge.org/mailman/listinfo.cgi/macruby-devel