2015-02-24 100 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之前斷言。

所以基本上這個函數會在閉包得到運行之前被調用並退出。

相關問題