readInBackgroundAndNotify
Reads from the file or communications channel in the background and posts a notification when finished.
- (void)readInBackgroundAndNotify
Discussion
This method performs an asynchronous
availableData
operation on a file or communications channel and posts anNSFileHandleReadCompletionNotification
notification on the current thread when that operation is complete. You must call this method from a thread that has an active run loop.[NSFileHandle readInBackgroundAndNotify]
The length of the data is limited to the buffer size of the underlying operating system. The notification includes auserInfo dictionary that contains the data read; access this object using the
NSFileHandleNotificationDataItem
key.[NSFileHandle readInBackgroundAndNotify]
Any object interested in receiving this data asynchronously must add itself as an observer of
NSFileHandleReadCompletionNotification
. In communication via stream-type sockets, the receiver is often the object returned in the userInfo dictionary of NSFileHandleConnectionAcceptedNotification
.
Note that this method does not cause a continuous stream of notifications to be sent. If you wish to keep getting notified, you’ll also need to call
readInBackgroundAndNotify
in your observer method.
Example of [NSFileHandle readInBackgroundAndNotify]
-(void)createSocket
{
// create socket and wait for events to come in
NSSocketPort* serverSock = [[NSSocketPort alloc] initWithTCPPort: 1234];
socketHandle = [[NSFileHandle alloc] initWithFileDescriptor: [serverSock socket]
closeOnDealloc: NO];
[[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(newConnection:)
name: NSFileHandleConnectionAcceptedNotification
object: socketHandle];
[socketHandle acceptConnectionInBackgroundAndNotify];
}
- (void)newConnection:(NSNotification*)notification
{
NSLog(@"connection accepted");
NSDictionary* userInfo = [notification userInfo];
NSFileHandle* remoteFileHandle = [userInfo objectForKey:
NSFileHandleNotificationFileHandleItem];
if([[userInfo allKeys] containsObject:@"NSFileHandleError"]){
NSNumber* errorNo = [userInfo objectForKey:@"NSFileHandleError"];
if( errorNo ) {
NSLog(@"NSFileHandle Error: %@", errorNo);
return;
}
}
[socketHandle acceptConnectionInBackgroundAndNotify];
[[NSNotificationCenter defaultCenter] addObserver:self
selector: @selector(processSocketData:)
name: NSFileHandleReadCompletionNotification
object: remoteFileHandle];
// Send a message to the client, acknowledging that the connection was accepted
[remoteFileHandle writeData: [@"OK" dataUsingEncoding: NSASCIIStringEncoding]];
[remoteFileHandle readInBackgroundAndNotify];
}