void MonitorFileDescriptors( int fileDescriptor1, int fileDescriptor2 ) { dispatch_source_t fd1Source = dispatch_source_create( DISPATCH_SOURCE_TYPE_READ, fileDescriptor1, 0UL, dispatch_get_main_queue() ); dispatch_source_set_event_handler( fd1Source, ^{ readDataFromFileDescriptor( fileDescriptor1 ); } ); dispatch_source_set_cancel_handler( fd1Source, ^{ dispatch_release( fd1Source ); close( fileDescriptor1 ); } ); dispatch_resume( fd1Source ); dispatch_source_t fd2Source = dispatch_source_create( DISPATCH_SOURCE_TYPE_READ, fileDescriptor2, 0UL, dispatch_get_main_queue() ); dispatch_source_set_event_handler( fd2Source, ^{ readDataFromFileDescriptor( fileDescriptor2 ); } ); dispatch_source_set_cancel_handler( fd2Source, ^{ dispatch_release( fd2Source ); close( fileDescriptor2 ); } ); dispatch_resume( fd2Source ); // Must call either dispatch_main(), [[NSRunLoop currentRunLoop] run], or CFRunLoopRun() }