Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 调度信号量信号赢得';t调用PHImageManager requestImageDataForAsset调用_Swift_Block_Grand Central Dispatch - Fatal编程技术网

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