Channel Directions in Objective-C
In Objective-C, we don’t have direct equivalents for channels, but we can simulate similar behavior using Grand Central Dispatch (GCD) and blocks. Here’s how we can translate the channel directions concept:
#import <Foundation/Foundation.h>
// This `ping` function uses a dispatch_queue_t for sending values.
// It would be a runtime error to try to receive on this queue.
void ping(dispatch_queue_t pings, NSString *msg) {
dispatch_async(pings, ^{
NSLog(@"Sending: %@", msg);
});
}
// The `pong` function uses one dispatch_queue_t for receives (pings)
// and a second for sends (pongs).
void pong(dispatch_queue_t pings, dispatch_queue_t pongs) {
dispatch_async(pings, ^{
dispatch_sync(pongs, ^{
NSLog(@"Received and forwarding message");
});
});
}
int main(int argc, const char * argv[]) {
@autoreleasepool {
dispatch_queue_t pings = dispatch_queue_create("com.example.pings", DISPATCH_QUEUE_SERIAL);
dispatch_queue_t pongs = dispatch_queue_create("com.example.pongs", DISPATCH_QUEUE_SERIAL);
ping(pings, @"passed message");
pong(pings, pongs);
// Wait for a moment to allow async operations to complete
[[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:1.0]];
}
return 0;
}
In this Objective-C version:
We use
dispatch_queue_t
to simulate channels. These are unidirectional by nature in GCD.The
ping
function takes adispatch_queue_t
for sending and a message. It asynchronously dispatches the message to the queue.The
pong
function takes twodispatch_queue_t
, one for receiving (pings) and one for sending (pongs). It asynchronously waits for a message on the pings queue and then synchronously sends to the pongs queue.In the
main
function, we create two serial dispatch queues to simulate the channels.We call
ping
andpong
similarly to the original example.Since GCD operations are asynchronous, we add a small delay at the end to allow the operations to complete before the program exits.
To run this program:
$ clang -framework Foundation your_file_name.m -o channel_directions
$ ./channel_directions
This will compile and run the Objective-C program. The output will show the messages being sent and received.
While this isn’t a direct translation of the channel directions concept, it demonstrates how we can achieve similar unidirectional communication patterns in Objective-C using GCD.