Re: KVO notifications and threads
Re: KVO notifications and threads
- Subject: Re: KVO notifications and threads
- From: "Clark Cox" <email@hidden>
- Date: Fri, 11 Jul 2008 12:14:46 -0700
On Fri, Jul 11, 2008 at 9:30 AM, Jerry Isdale <email@hidden> wrote:
> I have an application whose data model (classes, shared Instances, etc) gets
> updated by various threads for calculations, network comms, etc.
> Some of the application's Views use binding and KVO. For example an
> NSTextField may get bound to SharedInstance.currentLattitude
>
> It the property gets updated using KVO compliant code, on what thread is the
> NSTextField updated?
On the same thread as the property was set (i.e. probably not what you
want, as most views and controllers need to do their work on the main
thread).
>
> Possible answers include:
> * thread that invokes the set method
This.
> * MainThread - because all UI updates should happen there.
Not This :)
Essentially, you will have to make sure that all properties that are
being observed by views and their controllers happen on the main
thread. A category such as the following has helped me in the past in
such situations (warning, typed up from memory in my mail window):
@implementation NSObject(CSCAdditions)
- (void)CSCSetValueForKeyImpl:(NSDictionary*)dict {
[self setValue: [dict objectForKey: @"value"] forKeyPath: [dict
objectForKey: @"key"]];
}
- (void)CSCSetValueForKeyPathImpl:(NSDictionary*)dict {
[self setValue: [dict objectForKey: @"value"] forKeyPath: [dict
objectForKey: @"keyPath"]];
}
- (void)setValuesOnMainThreadForKeysWithDictionary:(NSDictionary
*)dict waitUntilDone:(BOOL)wait {
[self performSelectorOnMainThread:
@selector(setValuesForKeysWithDictionary:) withObject: dict
waitUntilDone: wait]
}
- (void)setValueOnMainThread:(id)value forKey:(NSString *)key
waitUntilDone:(BOOL)wait {
NSParameterAssert(key != nil);
[self performSelectorOnMainThread: @selector(CSCSetValueForKeyImpl:)
withObject: [NSDictionary
dictionaryWithObjectsAndKeys: keyPath, @"key", value, @"value", nil]
waitUntilDone: wait];
}
- (void)setValueOnMainThread:(id)value forKeyPath:(NSString *)keyPath
waitUntilDone:(BOOL)wait {
NSParameterAssert(keyPath != nil);
[self performSelectorOnMainThread: @selector(CSCSetValueForKeyPathImpl:)
withObject: [NSDictionary
dictionaryWithObjectsAndKeys: keyPath, @"keyPath", value, @"value",
nil]
waitUntilDone: wait];
}
@end
Then, you just have to make sure that any modifications to properties
that happen on a background thread go through one of these three
"-set...onMainThread:..." methods.
--
Clark S. Cox III
email@hidden
_______________________________________________
Cocoa-dev mailing list (email@hidden)
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:
This email sent to email@hidden