2015-02-24 103 views
1

我遇到问题,我的处理程序调用,我已经添加了一个println“调用处理程序”来查看我的结尾闭包是否被调用,但它从来没有。代码编译好并运行。这也是XCTest案件的一部分。到底是怎么回事?无法在Swift iOS中调用AVAssetImageGeneratorCompletionHandler

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") 
     } 
    } 

回答

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") 
} 

这使你的异步进程有机会测试完成之前完成。

0

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

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

相关问题