我在调用我的处理程序时遇到问题,我添加了一个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")
}
}
答案 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被调用之前被断言。
所以基本上这个函数会在闭包有时间运行之前被调用并退出。