swift - dispatch_semaphore_signal 不会调用 PHImageManager requestImageDataForAsset

标签 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
}    

最佳答案

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

您创建了一个信号量以确保您的 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/

相关文章:

ios - Swift 无法使用类型为 '(SomeType, Block (($T9) ->

采用数组或多个参数的 Ruby block

ios - 如何切换到MainThread来访问Realm对象

ios - dispatch_async_f 和 dispatch_async 有什么区别?

iphone - 可以将 cancel/isCancelled 与 GCD/dispatch_async 一起使用吗?

ios - 子类 XCTestCase 导致无法加载底层模块 XCTest

swift - 为什么我不能在 Swift 中将字符串数据分配给我的 nsuserdefaults?

arrays - Swift 使用 for-in 循环替换数组中的字符串

objective-c - 如何在 Swift Closure 中获取 Objective-C block 输入参数

ios - 当新数据可用时如何防止使用缓存?