Why not have an update flags function and a set of booleans that represent the 
flags.


@interface someInterface {
       BOOL _isFoo;
       BOOL _isBar;
}

@property (nonatomic, readonly, assign) BOOL isFoo;
@property (nonatomic, readonly, assign) BOOL isBar;

-(void) updateFlags:(int)bits;

@end


Then in your m file.

@interface someInterface()

// these you can set in update flags to trigger KVO
@property (nonatomic, readwrite, assign) BOOL isFoo;
@property (nonatomic, readwrite, assign) BOOL isBar;

@end

@implement someInterface
@synthesize isFoo = _isFoo;
@synthesize isBar = _isBar;

-(void) updateFlags:(int)bits {
       BOOL newFoo = (flags & 0x3) != 0;

       if ((newFoo) != self.isFoo)
               self.isFoo = newFoo;

.......
}

I wouldn't really worry about KVO being fired if value hasn't changed, unless 
its changing a lot. When ever the int changes you can call into updateFlags to 
update the BOOLs as needed which then fires off the KVO. You can use a 
temporary bool to check old against new if you want to selectively cause firing 
based on what has changed.

Scott

On Aug 22, 2012, at 3:31 AM, Andreas Grosam <[email protected]> wrote:

> 
> On 21.08.2012, at 22:35, Quincey Morris wrote:
> 
>> This doesn't make sense as it stands. You've declared properties that need 
>> setters as well as getters, and the setters (which you didn't show code for) 
>> will give you KVO compliance without any explicit will/didChanging.
> Well, the description says it all, I think ;)
> 
> I put the "code" in only for illustration. Stupidly, I didn't wrote the 
> property declaration correctly (just typed into mail). 
> 
> However, I think the text clearly states that I want to *retrieve* a *bool* 
> value from *several* properties where the value for each property will be 
> deduced from a set of bits from a common variable. The snippets show how the 
> *getters* are implemented and how I set the ivar _state. There are no 
> setters. 
> 
> 
> The correct public property declaration should be:
> 
> @property (nonatomic, readonly) BOOL isFoo;
> @property (nonatomic, readonly) BOOL isBar;
> 
>> 
>> The only reason for coding will/didChange explicitly would be if you need to 
>> do an end run around the setters -- either because you wish to coalesce 
>> notifications for multiple property changes, or because you want to change 
>> sets of bits that don't map directly to single properties.
> With respect, there are other reasons, too. For example, you need to 
> implement these methods manually if the property is declared in a super class 
> and if that super class does not support KVO. An example would be property 
> "isExecuting" from NSOperation if you implement a concurrent operation. In 
> fact, I'm trying to implement the *required* manual KVO compliance in a 
> subclass of NSOperation.
> 
> Another reason is, if you have a property that derives its value r from a 
> function f(x) for which there is no inverse function f-1  (f, in a 
> mathematical sense). In this case, there is no corresponding setter, since 
> this function f is *not invertible*.
> 
> Example:
> 
> bool f(int x) {
>    return (x & 0x03) != 0;
> }
> 
> This function f(x) is not bijective, that is there exists no invertible 
> function. Or, in other words, given an output value r you cannot find a 
> unique corresponding input x.
> 
> 
> @property (readonly) R foo;
> 
> -(R) foo { return f(_x); }  
> 
> Since, f(x) is not bijective, then there is no:
> -(void) setFoo:(R)r { ?? }
> 
> 
> So in this case, when _x changes, I need to implement manual KVO.
> 
> 
> This is exactly the problem I have, and which I described in my first post. 
> The implementation of property getter -bar shows, that its function is not 
> invertible. Thus, there can be no setter like:
> -(void)setBar:(BOOL) 
> 
> and KVO needs to be implemented manually, when the dependent variable _state 
> changes.
> 
> 
>> Either way, KVO notifications are never "inside" the atomicity of the 
>> properties, which means that the values passed in the notification (old or 
>> new value) won't necessarily have any meaning in a multi-threaded 
>> environment.
> Yes, and this is not what I strive to accomplish. Especially, I don't try to 
> manage concurrency with KVO! I'm totally aware that when retrieving a state, 
> it can already be stale. 
> 
>> It might be fine just to call both willChange and didChange after the bits 
>> are actually changed.
> OK, that's what my question was all about. If I do this, I especially don't 
> want to receive change notifications when the state did not actually change, 
> and furthermore, that the change dictionary in the notification method is 
> correctly setup.
> 
>> 
>> I have to mention, though, that it looks a bit like you're implementing 
>> atomicity where you really need thread safety. But that may be just because 
>> of details you've left out of your example code.
> 
> Atomic access is one approach which *may* ensure thread-safety, but it may 
> not always effectual. In my case it is sufficient to access shared resources 
> via atomic operations (it's just the _state ivar). 
> 
> The other reason using atomic operations is to prevent a method to be 
> executed when the prerequisite of the current state is not given. Taken 
> together, this makes the system thread safe.
> 
> 
> Hopefully, I could express my problem more clearly.
> 
> Many Thanks for your input!
> 
> 
> Regards
> Andreas
> 
> 
> 
> _______________________________________________
> 
> Cocoa-dev mailing list ([email protected])
> 
> 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/scottandrew%40roadrunner.com
> 
> This email sent to [email protected]


_______________________________________________

Cocoa-dev mailing list ([email protected])

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 [email protected]

Reply via email to