Super lovely code Jonathan.  My feeble brain ended up seeing if a delegate 
pattern would resolve this issue and it did.

The trick I am trying to achieve is simply "get the data out of the C class, 
the C/Obj-C glue and dump it into a more friendly structure to expose the data.

Having the data container register a weak reference with the C/Obj-C glue class 
and then letting the data sit there and be observed by a view controller gets 
me where I need to be now.

Ahh yes, hard mode is hard.

Thanks again.  



On Mar 8, 2016, at 4:16 PM, Jonathan Mitchell wrote:

> Alex
> 
>> On 8 Mar 2016, at 20:59, Alex Zavatone <z...@mac.com> wrote:
>> 
>> I'm browsing the Dubrovnik classes now to see the it handles returning the 
>> data now and am thinking of using another Obj-C object to register itself to 
>> have the data I care about sent to it.
> 
> KVO is very particular about the occurrence and sequencing of the 
> willChangeValueForKey: and didChangeValueForKey: methods. Get it right and 
> joy Reigns. Get it wrong and well…
> 
> It can tolerate some missing calls on the end component of a key path but a 
> failure higher up a key path chain is usually fatal. Of course there are 
> potential memory issues too. The objects in an observed key path need to 
> stick around while the observation is live. 
> 
> In Dubrovnik I translate the managed INotifyPropertyChanging and 
> INotifyPropertyChanged interface events into their KVO equivalents. I 
> incorporated a simple tracking mechanism that fired out warnings if an 
> anomaly in the KVO xxxChangeValueForKey: sequencing occurred.
> 
> It took a bit of time to get the kinks out of it all but in the end I have a 
> system that works reliably and enables me to bind many hundreds of NSControl 
> instances to properties of .Net managed classes.
> 
> So the KVO route may not be dead, just wounded. In my case to get things 
> sweet I had to disable automatic KVO notifications. For regular Cocoa classes 
> auto KVO is the way to go but if you need more precise control maybe not.
> 
> J
> 
>> 
>> Yeah, it's getting complex, that's for sure.
>> 
>> 
>> 
>> On Mar 4, 2016, at 7:06 PM, John McCall wrote:
>> 
>>> 
>>>> On Mar 4, 2016, at 4:03 PM, Greg Parker <gpar...@apple.com> wrote:
>>>> 
>>>> 
>>>>> On Mar 4, 2016, at 2:24 PM, Jonathan Mitchell <li...@mugginsoft.com> 
>>>>> wrote:
>>>>> 
>>>>> Hi Alex
>>>>> 
>>>>> Not sure if this will help at all as I am not 100% sure what you are 
>>>>> doing.
>>>>> In my case, using Mono, I needed to track events being raised in the Mono 
>>>>> C runtime back into Obj-C space.
>>>>> You need some method of defining a call back function in the target C Api 
>>>>> - without that thinks would look rather bleak.
>>>>> 
>>>>> Basically the C Mono runtime is configured to a call static C function in 
>>>>> an Obj C .m file in response to a C# managed event firing.
>>>>> The static then calls a static method on an Obj-C class.
>>>>> This Obj-C static uses collections to track registered events and invokes 
>>>>> performSelector: on a registered Obj-C target.
>>>>> See here:
>>>>> https://github.com/ThesaurusSoftware/Dubrovnik/blob/master/Framework/XCode/Representations/DBManagedEvent.m
>>>>> 
>>>>> One of the arguments based in as part of the event callback is a pointer 
>>>>> that is used as a a key to retrieve the target NSObject.
>>>>> This is complicated by the fact that the incoming pointer represents a 
>>>>> moveable memory location so there is some extra indirection too.
>>>>> https://github.com/ThesaurusSoftware/Dubrovnik/blob/master/Framework/XCode/Representations/DBPrimaryInstanceCache.m
>>>>> 
>>>>> This can get a bit complex but its all doable.
>>>> 
>>>> Block objects can help. clang supports block objects in plain C code 
>>>> (-fblocks, I think).
>>> 
>>> They're just enabled by default on our platform in all language modes.
>>> 
>>> John.
>>> 
>>>> Your Objective-C code can create a block object that performs the callback 
>>>> and pass it to the C code to store and call. The block object would 
>>>> capture the target NSObject so you don't need the dictionary of callback 
>>>> targets.
>>>> 
>>>> 
>>>> -- 
>>>> Greg Parker     gpar...@apple.com     Runtime Wrangler
>>>> 
>>>> 
>>>> 
>>>> _______________________________________________
>>>> 
>>>> Cocoa-dev mailing list (Cocoa-dev@lists.apple.com)
>>>> 
>>>> Please do not post admin requests or moderator comments to the list.
>>>> Contact the moderators at cocoa-dev-admins(at)lists.apple.com
>>>> 
>>>> Help/Unsubscribe/Update your Subscription:
>>>> https://lists.apple.com/mailman/options/cocoa-dev/rjmccall%40apple.com
>>>> 
>>>> This email sent to rjmcc...@apple.com
>>> 
>>> 
>>> _______________________________________________
>>> 
>>> Cocoa-dev mailing list (Cocoa-dev@lists.apple.com)
>>> 
>>> Please do not post admin requests or moderator comments to the list.
>>> Contact the moderators at cocoa-dev-admins(at)lists.apple.com
>>> 
>>> Help/Unsubscribe/Update your Subscription:
>>> https://lists.apple.com/mailman/options/cocoa-dev/zav%40mac.com
>>> 
>>> This email sent to z...@mac.com
>> 
>> 
>> _______________________________________________
>> 
>> Cocoa-dev mailing list (Cocoa-dev@lists.apple.com)
>> 
>> Please do not post admin requests or moderator comments to the list.
>> Contact the moderators at cocoa-dev-admins(at)lists.apple.com
>> 
>> Help/Unsubscribe/Update your Subscription:
>> https://lists.apple.com/mailman/options/cocoa-dev/lists%40mugginsoft.com
>> 
>> This email sent to li...@mugginsoft.com
> 


_______________________________________________

Cocoa-dev mailing list (Cocoa-dev@lists.apple.com)

Please do not post admin requests or moderator comments to the list.
Contact the moderators at cocoa-dev-admins(at)lists.apple.com

Help/Unsubscribe/Update your Subscription:
https://lists.apple.com/mailman/options/cocoa-dev/archive%40mail-archive.com

This email sent to arch...@mail-archive.com

Reply via email to