Opening dual NSStreams synchronously
Opening dual NSStreams synchronously
- Subject: Opening dual NSStreams synchronously
- From: Richard Penwell <email@hidden>
- Date: Tue, 02 Feb 2010 11:38:52 -0500
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 (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