无法在Swift iOS中调用AVAssetImageGeneratorCompletionHandler

时间:2015-02-24 09:30:00

标签: ios swift video

我在调用我的处理程序时遇到问题,我添加了一个println“调用处理程序”,看看我的尾随闭包是否被调用,但它永远不会。代码编译好并运行。这也是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")
        }
    }

2 个答案:

答案 0 :(得分:1)

您应该使用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")
}

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

答案 1 :(得分:0)

对于遇到类似问题的人 这段代码运行了一个单元测试用例的一部分,它在Closure被调用之前被断言。

所以基本上这个函数会在闭包有时间运行之前被调用并退出。