无法在 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")
}
这使您的异步过程有机会在完成测试之前完成。
我在调用我的处理程序时遇到问题,我添加了一个 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")
}
这使您的异步过程有机会在完成测试之前完成。