gpt4 book ai didi

swift - dispatch_semaphore_signal 不会调用 PHImageManager requestImageDataForAsset

转载 作者:行者123 更新时间:2023-11-28 08:51:43 33 4
gpt4 key购买 nike

这是我的代码,我的问题是我想在异步调用后等待结果。所以我尝试使用信号量,但是 dispatch_semaphore_signal 从未被调用,所以出现了死锁。我不知道如何解决这个问题。谁能告诉我发生了什么,非常感谢

extension PHAsset{

func getAVAssetRepresent() -> AVURLAsset?{

var asset:AVURLAsset?

let semaphore = dispatch_semaphore_create(0)

let queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)

dispatch_async(queue) { () -> Void in

switch self.mediaType{

case .Image:
PHImageManager.defaultManager().requestImageDataForAsset(self, options: nil) { (_, _, _, info) -> Void in
if let _ = info , let url = info!["PHImageFileURLKey"] as? NSURL{
asset = AVURLAsset(URL: url)
}
dispatch_semaphore_signal(semaphore)
}

default :
dispatch_semaphore_signal(semaphore)
}

}
dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);

return asset
}

最佳答案

因此,在进一步查看您的代码后,我认为您的代码可能自相矛盾。

您创建了一个信号量以确保您的 requestImageDataForAsset 在继续之前完成执行。这表明您希望您的请求同步执行,并且您不希望在请求完成之前发生任何事情。

但是,您还可以在全局并发调度队列上异步调度您的requestImageDataForAsset。这样做表明您希望您的请求在后台异步发生

所以我相信,如果您希望您的请求同步发生,您应该简单地删除您的dispatch_async(queue)...调用。
如果您希望您的请求发生异步,您应该删除dispatch_semaphore

但是,如果你想保持现在的代码,你将需要搅动运行循环以继续执行(特别是在这种情况下,你异步发送的请求)

是这样的:(请原谅 Objective-C,不幸的是我对 swift 没有信心)

while (dispatch_semaphore_wait(semaphore, DISPATCH_TIME_NOW))
[[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode
beforeDate:[NSDate dateWithTimeIntervalSinceNow:10]];

关于swift - dispatch_semaphore_signal 不会调用 PHImageManager requestImageDataForAsset,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34012651/

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