从后台线程访问 [UIApplication 共享应用程序] 可以吗?



在处理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;
}

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

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

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

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

绝对是的,因为如果您在 Xcode 上使用主线程检查器运行您的应用程序,则从后台线程访问时会将UIApplication sharedApplication调用突出显示为问题

问题 2:如果是,我更改的代码能否解决问题?

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

还是有更好的方法?

我会坚持这样的东西:

- (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而不是使用信号量

相关内容

最新更新