On 13 Aug 2014, at 23:41, Quincey Morris <quinceymor...@rivergatesoftware.com> 
wrote:

> On Aug 13, 2014, at 14:53 , Jonathan Mitchell <jonat...@mugginsoft.com> wrote:
> 
>> At one point i need to invoke a manual KVO notification like so:
>> 
>> [submission willChangeValueForKey:@“status”];
>> [submission didChangeValueForKey:@“status”];
>> 
>> This raises like so:
>> 
>> Terminating app due to uncaught exception 
>> 'NSInternalInconsistencyException', reason: 'Cannot update for observer 
>> <NSKeyValueObservance 0x608000ac21b0> for the key path "status.name" from 
>> <Submission 0x6080003aa800>, most likely because the value for the key 
>> "status" has changed without an appropriate KVO notification being sent. 
>> Check the KVO-compliance of the Submission class.’
> 
> This is one of those infuriating errors that is hard to make sense of. Try 
> thinking about it literally.
> 
> Because you’re observing the “status.name” path from ‘submission’, the 
> observer is *also* observing the “name” path from ‘submission.status’**. In 
> your scenario, the originally observed ‘status’ instance (call it X) is no 
> longer the current ‘status’ instance at willChange time (it’s now Y, say), 
> and in general it might not be the same as that at didChange time (Z, say). 
> Even if Y == Z, there’s been a non-KVO-compliant change in ‘status’ prior to 
> the notification being sent.
> 
> Now, we do this quite often, without problems, but I’d suggest that’s only in 
> cases where the “temporarily non KVO compliant” change is for the *last* key 
> of the path — in which case the last object isn’t being observed, just 
> because it’s the last key.

This is where I am getting caught out. As you say it works fine for the last 
key of the path. It does for me too.

I am effectively propagating a C# PropertyChanged event. This approach by 
itself will never be KVO compliant and will fail when mutating non last 
components in an observed key path.
> 
> So, in the case of a non-KVO-compliant change to the value of a non-terminal 
> key path object, the non-KVO-compliance may not be tolerated by the 
> frameworks. Hence this error message.
> 
> What I suggest you try is to make two properties: “currentStatus” and 
> “observableStatus”. The second of these would be updated KVO compliantly 
> (i.e. via its setter) when you know that the first has changed and the change 
> should be propagated (i.e. in the places where you now trigger the 
> willChange/didChange notification manually). Code in the ‘submission’ class 
> can use ‘self.currentStatus’ to get or set the most recent status object; 
> observers would observe “observableStatus”, of course.
Using a proxy property sounds like it might be doable.

Thanks

Jonathan
_______________________________________________

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