dispatch_semaphore_signal不会调用调用的PHImageManager requestImageDataForAsset

时间:2015-12-01 04:31:52

标签: swift block grand-central-dispatch

这是我的代码,我的问题是我想在异步调用后等待结果。所以我尝试使用信号量,但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
}    

1 个答案:

答案 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]];