从后台线程访问 [UIApplication sharedApplication] 可以吗?

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

在处理 Objective-C 时,我需要在某些后台线程中获取 protectedDataAvailable 状态。

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

当我访问 [UIApplication sharedApplication] 时,我怀疑代码块应该 运行 在主队列中。 我该怎么做?

我想改成这样,

- (BOOL) isProtected {

    BOOL protectedDataAvailable = NO;

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

    return protectedDataAvailable;
}

问题一:代码应该运行在主队列/UI线程中吗?

问题 2:如果是,我更改的代码是否可以解决问题?或者有什么更好的方法吗?

我问这个问题的原因是,即使我同步访问 主队列上的 UIApplication,当从 main thread 调用块时它会崩溃。我该如何处理这个问题?

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

绝对是,因为如果您 运行 您的应用在 Xcode 上具有主线程检查器,那么当从后台线程

访问时,会突出显示调用 UIApplication sharedApplication 作为问题

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

除非你从主线程调用 isProtected 是。

or is there any better approach?

我会坚持这样的事情:

- (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;
}

正如 Alejandro Ivan 在评论中指出的那样,您可以使用简单的 dispatch_sync

而不是使用信号量