- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我有一个方法可以给我照片授权状态。
func photosAuthorizationStatus() -> PHAuthorizationStatus {
var authStatus = PHAuthorizationStatus.notDetermined
let semaphore = DispatchSemaphore(value: 0)
PHPhotoLibrary.requestAuthorization { (status: PHAuthorizationStatus) in
authStatus = status
semaphore.signal()
}
semaphore.wait()
return authStatus
}
我在 ViewController 的 viewDidAppear 中调用此方法,但应用程序没有卡住。
但是如果我在明确询问 mainQueue 时调用 semaphore.wait 应用程序卡住。
DispatchQueue.main.async{
let semaphore = DispatchSemaphore(value: 0)
semaphore.wait()
}
//上面的代码将卡住应用程序。
我能知道原因吗?
最佳答案
在你的标题中,你问:
can I call on semaphore.wait() main thread?
你应该避免以任何理由阻塞主线程。无论是 wait
信号量还是调度组,甚至同步调度(例如 sync
)超过几毫秒的任何东西。如果您在错误的时间执行此操作,则可能会导致看门狗进程终止您的应用程序,这会导致糟糕的用户体验。
然后你继续问:
DispatchQueue.main.async {
let semaphore = DispatchSemaphore(value: 0)
semaphore.wait()
}Above code will freeze the application.
Can I know the reason
该代码表示“阻塞主线程等待此信号量上的信号
”。因此,在 signal
到达之前,主线程将被阻塞。但是主线程永远不应该被阻塞,因为它服务于 UI,如果您死锁主线程,您的应用程序将卡住。
底线,永远不要阻塞主线程。
关于ios - 我可以调用 semaphore.wait() 主线程吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50791315/
有人可以向我澄清主线 DHT 规范中的声明吗? Upon inserting the first node into its routing table and when starting up th
我正在尝试使用 USB 小工具驱动程序使嵌入式设备作为 MTP 设备工作。 我知道 Android 从大容量存储设备切换到 MTP 设备已经有一段时间了,并且找到了 source code for M
我是一名优秀的程序员,十分优秀!