无法在 Swift iOS 中调用 AVAssetImageGenerator CompletionHandler

Trouble Calling AVAssetImageGeneratorCompletionHandler in Swift iOS

我在调用我的处理程序时遇到问题,我添加了一个 println "called handler" 来查看我的尾随闭包是否被调用,但它从未调用过。代码编译正常并运行。这也是 XCTest 案例的一部分。怎么回事?

    println("going to genenerate images... count: \(array.count)")
    generator.generateCGImagesAsynchronouslyForTimes(array) { (time: CMTime, image: CGImage!, cmtTime: CMTime, result:
        AVAssetImageGeneratorResult, error: NSError!) in

        println("called handler")
        if (result == AVAssetImageGeneratorResult.Succeeded) {
            if var value = UIImage(CGImage: image) {
                flipBookImagesArray.append(value)
            }

        }
        if (result == AVAssetImageGeneratorResult.Failed) {
            println("Failed with error: \(error.localizedDescription) , \(error.code)")
        }
        if (result == AVAssetImageGeneratorResult.Cancelled) {
            println("Cancelled")
        }
    }

对于那些 运行 遇到类似问题的人。
此代码是 运行 单元测试用例的一部分,它在调用闭包之前断言。

所以基本上函数将在闭包时间到 运行 之前被调用并退出。

您应该使用 XCTestExpectation 在单元测试中包装异步进程:

func testAssetImageGenerator() {

    // configure `array`, `generator`, etc. here

    // now, create expectation

    let expectation = self.expectationWithDescription("generateCGImagesAsynchronouslyForTimes")

    // have a counter to keep track of how often `generator.generateCGImagesAsynchronouslyForTimes` will be called

    var imageCount = array.count

    generator.generateCGImagesAsynchronouslyForTimes(array) { (time: CMTime, image: CGImage!, cmtTime: CMTime, result:
        AVAssetImageGeneratorResult, error: NSError!) in

        println("called handler")
        if (result == .Succeeded) {
            // do your success stuff in here
        }
        if (result == .Failed) {
            XCTFail("Failed with error: \(error.localizedDescription) , \(error.code)")
        }
        if (result == .Cancelled) {
            XCTFail("Cancelled")
        }

        imageCount--
        if imageCount < 1 {
            expectation.fulfill()
        }
    }

    waitForExpectationsWithTimeout(30, handler: nil)

    XCTAssertEqual(imageCount, 0, "We still have \(imageCount) left")
}

这使您的异步过程有机会在完成测试之前完成。