Swift 调度信号量信号赢得';t调用PHImageManager requestImageDataForAsset调用
这是我的代码,我的问题是我想在异步调用后等待结果。因此,我尝试使用信号量,但从未调用Swift 调度信号量信号赢得';t调用PHImageManager requestImageDataForAsset调用,swift,block,grand-central-dispatch,Swift,Block,Grand Central Dispatch,这是我的代码,我的问题是我想在异步调用后等待结果。因此,我尝试使用信号量,但从未调用dispatch\u semaphore\u signal,因此出现了死锁。我不知道如何解决这个问题。有人能告诉我发生了什么吗,非常感谢 extension PHAsset{ func getAVAssetRepresent() -> AVURLAsset?{ var asset:AVURLAsset? let semaphore = dispatch_semaphore_create
dispatch\u semaphore\u 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
。这样做意味着您希望您的请求在后台异步发生
因此,我认为,如果您希望请求同步进行,只需删除调度\u异步(队列)…
调用。如果希望请求以异步方式发生,则应删除
dispatch\u信号量
但是如果您想保持代码现在的状态,则需要搅动runloop以继续执行(特别是在这种情况下,异步调度的请求)
类似这样:(请原谅Objective-C,不幸的是我对swift没有信心)
所以在看了你的代码之后,我认为你的代码可能是矛盾的
您创建了一个信号量,以确保requestImageDataForAsset
在继续之前完成执行。这意味着您希望请求同步执行,,并且在请求完成之前不希望发生任何事情
但是,您也可以在全局并发分派队列上异步分派requestImageDataForAsset
。这样做意味着您希望您的请求在后台异步发生
因此,我认为,如果您希望请求同步进行,只需删除调度\u异步(队列)…
调用。
如果希望请求以异步方式发生,则应删除dispatch\u信号量
但是如果您想保持代码现在的状态,则需要搅动runloop以继续执行(特别是在这种情况下,异步调度的请求)
类似这样:(请原谅Objective-C,不幸的是我对swift没有信心)
您的信号量使用是正确的——并且根据PHImageManager类引用,即使在发生错误/失败的情况下,块也应该输入。您确定在决定它死锁之前等待的时间足够长吗?您是否尝试过在requestImageDataForAsset
完成块内设置断点,以查看是否进入该块?我想我已经等待了足够的时间,但它从未进入requestImageDataForAsset
完成块,如果不存在信号量,如果信号量使用正确,则将调用完成块——根据PHImageManager类引用,即使在发生错误/失败的情况下,该块也应输入。您确定在决定它死锁之前等待的时间足够长吗?您是否尝试过在requestImageDataForAsset
完成块中放置断点,以查看是否进入该块?我想我已经等待了足够的时间,但它从未进入requestImageDataForAsset
完成块,如果不存在信号量,将调用完成块
while (dispatch_semaphore_wait(semaphore, DISPATCH_TIME_NOW))
[[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode
beforeDate:[NSDate dateWithTimeIntervalSinceNow:10]];