I'm running into a problem with my code that is most easily solved by splitting 
up everything into a client server model, where the client is the main thread 
of my application, and the server is a background thread that does networking 
type stuff.  I want the client to update itself as soon as there are any 
changes in the server.  I have two options; I can fix the server to call 
methods in the client when there are updates, and vice-versa, or I can use KVO 
and have the client observe changes in the server.  The former is fast and 
easy, but it means that I can only have one client and one server, which is too 
brittle for what is happening.  KVO is ideal, but I don't know it works across 
threads.  My current plan of action is something akin to the following (I 
banged all of this out in outlook, so there may be syntax errors, but I hope 
this gets the gist across):

--- Server.h ---
@interface server : NSObject
{
        NSImage *periodicallyChangingImage;
        NSThread *updaterThread;
        id <sourceProtocol> imageSource;
}

@property(retain, readonly) NSImage *periodicallyChangingImage;
- (id) initWithSource:(id <sourceProtocol>) source;

@end
--- End of Server.h ---

--- Server.m ---
@interface server()
@property(retain, readwrite) NSImage *periodicallyChangingImage;
@property(retain, readwrite) NSThread *updaterThread;
@property(retain, readwrite) id <sourceProtocol>) imageSource;
- (void) threadSelector:(id)object;
@end

@implementation

@synthesize periodicallyChangingImage;
@synthesize updaterThread;
@synthesize imageSource;

- (id) initWithSource:(id <sourceProtocol>) source
{
        self = [super init];
        if (self)
        {
                self.imageSource = source;
                self.updaterThread = [NSThread initWithTarget:self 
selector:@selector(threadSelector:) object:self];
                [self.updaterThread start];
        }
        return self;
}

- (void) threadSelector:(id)object
{
        server *theServer = (server *) object;
        NSImage *temp;
        while ([self.updaterThread isCancelled] == NO)
        {
                temp = [self.imageSource getImageBlob]; // This line blocks for 
a long time sometimes

                // I'm hoping that the compiler is smart about locking & 
unlocking, but splitting the lines should 
                // take care of any long hangs (the line above hangs, but the 
line below is fast)

                theServer.periodicallyChangingImage = temp;
        }
}

@end
--- End of Server.m ---

--- Client.h ---
@interface client : NSObject
{
        server *imageServer;
}

- (id) initWithServer:(server *) newServer;

@end
--- End of Client.h ---

--- Client.m ---
@interface client()
@property(retain, readwrite) server *imageServer;
@end

@implementation

@synthesize imageServer;

- (id) initWithServer:(server *) newServer
{
        self = [super init];
        if (self)
        {
                self.imageServer = newServer;
                [self observeValueForKeyPath:@"periodicallyChangingImage" 
                        ofObject:newServer 
                        change:NSKeyValueObservingOptionsNew 
                        context:NULL];
        }
        return self;
}

- (void) observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object 
change:(NSDictionary *)change context:(void *)context
{
        switch (object)
        {
                case self.imageServer:
                        if ([keyPath isEqual:@"periodicallyChangingImage"])
                        {
                                // Do something with 
server.periodicallyChangingImage, probably display it immediately.
                        }
                        break;
                default:
                        // No idea what the object is, do something intelligent 
to report the error
                        break;
        }
}

@end
--- End of Client.m ---

I know that properties are supposed to default to thread-safe, and I know that 
as long as I don’t explicitly specify getter/setter methods, properties should 
be KVC/KVO compliant, but I'm not sure if the above is 100% kosher.  Is there 
anything I should be worried about?

Thanks,
Cem Karan
_______________________________________________

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:
http://lists.apple.com/mailman/options/cocoa-dev/archive%40mail-archive.com

This email sent to [EMAIL PROTECTED]

Reply via email to