In case anyone wants the solution to this puzzle ;-)

while (([inputStream streamStatus] & [outputStream streamStatus]) == 
NSStreamStatusOpening && [[NSRunLoop currentRunLoop] 
runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]]);

That line will pump the asynchronous events and test that both streams are 
open. It should also include a timeout value as well.

On Feb 2, 2010, at 11:38 AM, Richard Penwell wrote:

> 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/almightylinuxgod%40me.com
> 
> This email sent to almightylinux...@me.com

_______________________________________________

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