这是我的代码,我的问题是我想在异步调用后等待结果。所以我尝试使用信号量,但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
}
答案 0 :(得分:0)
因此,在仔细查看您的代码之后,我认为您的代码可能存在矛盾。
您创建了一个信号量,以确保您的requestImageDataForAsset
在继续之前完成执行。这表示您希望您的请求执行同步,并且在请求完成之前您不希望发生任何事情。
但是,您还要在全局并发调度队列上异步调度requestImageDataForAsset
。这样做表明您希望您的请求在后台异步发生
因此,我相信如果您希望您的请求以同步发生,则只需删除dispatch_async(queue)...
来电。
如果您希望您的请求发生异步,则应删除dispatch_semaphore
。
然而,如果您想保留现在的代码,则需要流失runloop以继续执行(特别是在这种情况下,您异步调度的请求)< / p>
这样的事情:(原谅Objective-C,我很遗憾对swift没有信心)
while (dispatch_semaphore_wait(semaphore, DISPATCH_TIME_NOW))
[[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode
beforeDate:[NSDate dateWithTimeIntervalSinceNow:10]];