gpt4 book ai didi

ios - 我可以调用 semaphore.wait() 主线程吗?

转载 作者:搜寻专家 更新时间:2023-11-01 07:01:50 25 4
gpt4 key购买 nike

我有一个方法可以给我照片授权状态。

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com