从Swift Playground中的Completion Handler打印到控制台

时间:2015-06-22 20:10:48

标签: xcode swift cocoa-touch swift-playground

我想尝试使用NSURLSession来获取RSS数据,看看它会是什么样子。我在Playground中编写了一大块代码,当它没有工作时,我扼杀了完成处理程序代码并输入了一个打印(" hello,world")来验证块是否正在运行。

let session = NSURLSession(configuration: NSURLSessionConfiguration.defaultSessionConfiguration())
let task = session.dataTaskWithURL(NSURL(string:"http://apod.nasa.gov/apod.rss")!, completionHandler:
{(data:NSData?, response:NSURLResponse?, error:NSError?) in
    print("hello, world")
}
)!
task.resume()

在Playground中,没有任何内容打印到控制台。但是我把这个代码放到了Xcode项目中,它运行得很好。为什么呢?

3 个答案:

答案 0 :(得分:1)

我在尝试使用NSURLSession时遇到了这个问题。首先,您需要import XCPlayground,并致电XCPSetExecutionShouldContinueIndefinitely()。这将允许代码异步运行。

我无法告诉你为什么完全打印不起作用。我所知道的是,我对同样的问题感到困惑,直到我对数据进行快速可选绑定(所有完成闭包的参数都是选项,请注意)。无论出于何种原因,这都有效,并且您的打印声明会被打印出来。

let session = NSURLSession(configuration: NSURLSessionConfiguration.defaultSessionConfiguration())
let task = session.dataTaskWithURL(NSURL(string:"http://apod.nasa.gov/apod.rss")!, completionHandler:
    {(data:NSData?, response:NSURLResponse?, error:NSError?) in
        if let data = data
        {
            print("hello, world")
        }
    }
    )!
task.resume()

答案 1 :(得分:1)

Xcode 7.2中的

“XCPSetExecutionShouldContinueIndefinitely”已被弃用,现在您可以执行以下操作:

import XCPlayground

//create instance of current playground page
let page = XCPlayground.XCPlaygroundPage
page.currentPage.needsIndefiniteExecution = true

//create your completion handler function
func completionHandlerFunction(callBack: (message: String, error: ErrorType?) -> Void){
    callBack(message: "finish", error: nil)
}

//call the the completion handler function
completionHandlerFunction { (message, error) -> Void in
    print(message) //output on the right side will be "finish\n"

//perform .finishExecution() on current page when block is executed
    page.currentPage.finishExecution()
}

答案 2 :(得分:0)

当我尝试从URL completeHandler内部进行打印时,这对我有用:

class