Sazzad Hissain Khan
Sazzad Hissain Khan

Reputation: 40146

Is it ok accessing [UIApplication sharedApplication] from background thread?

While working on Objective-C, I need to get the protectedDataAvailable status possibly inside some background threads.

- (BOOL) isProtected {
    BOOL protectedDataAvailable = [[UIApplication sharedApplication] isProtectedDataAvailable];
    return protectedDataAvailable;
}

As I am accessing [UIApplication sharedApplication], I suspect that the code block should run in main queue. How can I do so?

I was thinking to change it like,

- (BOOL) isProtected {

    BOOL protectedDataAvailable = NO;

    dispatch_sync(dispatch_get_main_queue(), ^{
        protectedDataAvailable = [[UIApplication sharedApplication] isProtectedDataAvailable];
    });

    return protectedDataAvailable;
}

Question 1: Should the code be run inside main queue/ UI Thread?

Question 2: If yes, will my changed code resolve the problem? or is there any better approach?

The reason I am asking this question is, even if I access the UIApplication on main queue synchronously, when the block gets called from main thread it gets crash. How can I deal with this problem?

Upvotes: 1

Views: 1299

Answers (1)

Andrey Chernukha
Andrey Chernukha

Reputation: 21808

Question 1: Should the code be run inside main queue/ UI Thread?

Definitely yes because if you run your app with the main thread checker on Xcode will highlight calls UIApplication sharedApplication as issues when accessed from a background thread

Question 2: If yes, will my changed code resolve the problem?

Unless you call isProtected from the main thread yes.

or is there any better approach?

I would stick to something like this:

- (BOOL)isProtected
{
    __block BOOL protectedDataAvailable = NO;

    if ([NSThread isMainThread])
    {
        protectedDataAvailable = [[UIApplication sharedApplication] isProtectedDataAvailable];
    }
    else
    {
        dispatch_sync(dispatch_get_main_queue(), ^{

            protectedDataAvailable = [[UIApplication sharedApplication] isProtectedDataAvailable];
        });
    }

    return protectedDataAvailable;
}

As Alejandro Ivan pointed in the comment instead of using a semaphore you can resort to simple dispatch_sync

Upvotes: 1

Related Questions