iOS for C# Developer – part 3: multithreading

This post is part of the series: iOS for C# Developer. Previous parts:

The most typical scenario to use multithreading is to maintain responsive UI when we do some resource-consuming computation.

C#

Let’s consider simple button click action in C#:

private void Button_Click(object sender, RoutedEventArgs e)
{
    this.status.Content = "Computing...";
    Compute();
    this.status.Content = "Done";
}

private void Compute()
{
    Thread.Sleep(5000);            
}

Method Compute() is a CPU-intensive operation (simulated by Sleep() function).

Above code will block UI during computation. To keep UI responsive, computation has to take place in a separate thread. It can be done easily using async/await keywords:

private async void Button_Click(object sender, RoutedEventArgs e)
{
    this.status.Content = "Computing...";
    await Compute();
    this.status.Content = "Done";
}

private async Task Compute()
{
    await Task.Factory.StartNew(() =>
    {
        Thread.Sleep(5000);
    });
}

iOS

This is equivalent (single-threaded) button click handler in iOS:

- (IBAction)buttonClick:(id)sender
{
    self.status.text = @"Computing...";
    [self compute];
    self.status.text = @"Done";
}

- (void)compute
{
    [NSThread sleepForTimeInterval:5];
}

Multithreaded version is a little bit different. In Objective-C, there is no syntax similar to async/await. Thus, status update has to be invoked by background thread explicitly. Additionally, every UI operation (in this case: label text update) has to be done in the main thread. Below code, use Dispatch Queues, which is the easiest and recommended way for multithreading scenarios:

- (IBAction)buttonClick:(id)sender
{
    self.status.text = @"Computing...";
    [self compute];
}

- (void)compute
{
    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    dispatch_async(queue, ^{
        [NSThread sleepForTimeInterval:5];
        dispatch_async(dispatch_get_main_queue(), ^{
            self.status.text = @"Done";
        });
    });
}

This multithreaded code will look pretty similar in Swift.

Summary

Invoking background threads is much easier from developer perspective in C#. Code is concise and more readable. Multithreading in Objective-C introduce some overhead, but it is not very hard to handle.