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