How to retrieve an observer's context?
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
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
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
participants (2)
-
Edward Hynes
-
Laurent Sansonetti