Hello Devs,

I'd like some feedback on my design here as I'm building an API that I hope 
will be of use to the community, and some of the finer nuances of Cocoa still 
escape me.

I'm building a class called TDSConnection which is part of a object graph 
providing connectivity to the Tabular Data Stream format in objective-c.  (TDS 
is the Microsoft SQL protocol).  What I've got is some interesting threading 
and synchronization issues.  The one that I'm trying to check for correctness 
currently is thus:

I have a method -[TDSConnection open] which should open two NSStreams (input 
and output), block until both are open or erred then perform the TDS packets 
for login.  The method of doing this for me looks like this:

- (void)open
{
        [self close];
        
        [NSStream getStreamsToHost:host 
                                                  port:port 
                                   inputStream:&inputStream 
                                  outputStream:&outputStream];
        
        [inputStream setDelegate:self];
        [outputStream setDelegate:self];
        
        [inputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] 
                                                   
forMode:NSDefaultRunLoopMode];
        [outputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] 
                                                        
forMode:NSDefaultRunLoopMode];
        
        [inputStreamCondition lock];
        [outputStreamCondition lock];
        [inputStream open];
        [outputStream open];
        
        [inputStreamCondition wait];
        [outputStreamCondition wait];
}

- (void)stream:(NSStream *)stream handleEvent:(NSStreamEvent)eventCode
{
        if (stream == inputStream) {
                [self handleInputStreamEvent:eventCode];
        } else if (stream == outputStream) {
                [self handleOutputStreamEvent:eventCode];
        } else {
                NSLog(@"Recieved a stream event for instance %@ which was not 
the input or output stream", stream);
        }
}

- (void)handleInputStreamEvent:(NSStreamEvent)eventCode {
        switch (eventCode) {
                case NSStreamEventOpenCompleted:
                        [inputStreamCondition signal];
                        break;
                default:
                        break;
        }
}

- (void)handleOutputStreamEvent:(NSStreamEvent)eventCode {
        switch (eventCode) {
                case NSStreamEventOpenCompleted:
                        [outputStreamCondition signal];
                        break;
                default:
                        break;
        }
}

As can be seen, I am using a NSCondition to block the main thread until I 
receive both NSStreamEventOpenCompleted events.

I have a feeling that this code smells a bit, and was wondering if someone 
who's done some networking programming has recommendations.


Grateful as always,
Richard
_______________________________________________

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 arch...@mail-archive.com

Reply via email to