如何在Playground中运行异步回调

前端之家收集整理的这篇文章主要介绍了如何在Playground中运行异步回调前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
许多Cocoa和CocoaTouch方法具有在Objective-C和Closures中实现为块的完成回调。但是,当在Playground中尝试这些时,完成不会被调用。例如:
  1. // Playground - noun: a place where people can play
  2.  
  3. import Cocoa
  4. import XCPlayground
  5.  
  6. let url = NSURL(string: "http://stackoverflow.com")
  7. let request = NSURLRequest(URL: url)
  8.  
  9. NSURLConnection.sendAsynchronousRequest(request,queue:NSOperationQueue.currentQueue() {
  10. response,maybeData,error in
  11.  
  12. // This block never gets called?
  13. if let data = maybeData {
  14. let contents = NSString(data:data,encoding:NSUTF8StringEncoding)
  15. println(contents)
  16. } else {
  17. println(error.localizedDescription)
  18. }
  19. }

我可以在我的Playground时间轴看到控制台输出,但在我的完成块中的println从来不叫…

虽然你可以手动运行一个运行循环(或者,对于不需要运行循环的异步代码,使用其他等待方法,如dispatch semaphores),我们在playgrounds中提供的等待异步工作的“内置”方法是:导入XCPlayground框架并设置XCPlaygroundPage.currentPage.needsIndefiniteExecution = true。如果这个属性已经设置,当你的顶级playground源完成,而不是停止playground,我们将继续旋转主运行循环,所以异步代码有机会运行。我们最终将在超时后终止playground,默认为30秒,但如果您打开助理编辑器并显示时间轴助手,可以配置;超时在右下方。

不幸的是,这个开发者预览不包括iOS的XCPlayground;仅适用于OSX。

使用有问题的代码的工作示例

  1. import UIKit
  2. import XCPlayground
  3.  
  4. let url = NSURL(string: "http://stackoverflow.com")
  5. let request = NSURLRequest(URL: url!)
  6.  
  7. NSURLConnection.sendAsynchronousRequest(request,queue: NSOperationQueue.currentQueue()) { response,error in
  8. if let data = maybeData {
  9. let contents = NSString(data:data,encoding:NSUTF8StringEncoding)
  10. println(contents)
  11. } else {
  12. println(error.localizedDescription)
  13. }
  14. }
  15.  
  16. XCPlaygroundPage.currentPage.needsIndefiniteExecution = true

猜你在找的Swift相关文章