从后台线程访问 [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
而不是使用信号量
在处理 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