我试图在Swift 2.0中的异步NSTimer.scheduledTimerWithTimeInterval
中嵌套NSURLSession.sharedSession().dataTaskWithRequest
调用,但test
内的代码块似乎没有被评估。
例如:
class testc{
@objc func test()
{
print("hello");
}
func loop()
{
if let url = NSURL(string : "https://www.google.com")
{
let url_req = NSURLRequest(URL: url);
let task = NSURLSession.sharedSession().dataTaskWithRequest(url_req)
{ data, response, error in
let timer = NSTimer.scheduledTimerWithTimeInterval(1, target: self, selector: #selector(testc.test), userInfo: nil, repeats: true)
}
task.resume()
}
}
}
如果我们初始化此类并运行loop
没有任何反应,则永远不会评估函数test
。
答案 0 :(得分:2)
您需要对代码进行两处更改。
创建dataTask之后。您需要让它继续()发送请求。 需要在主线程上调用计时器。
在您的情况下,dataTask是一个在后台线程上运行的异步任务。在下面的实现中,我们跳回主线程来触发计时器。
我添加了一个计数器来验证计时器是否反复触发。
请参阅下面的更新代码。
class testc{
static var counter : Int = 0
@objc func test()
{ testc.counter++
print("hello -> \(testc.counter)");
}
func loop()
{
if let url = NSURL(string : "https://www.google.com")
{
let url_req = NSURLRequest(URL: url);
let task = NSURLSession.sharedSession().dataTaskWithRequest(url_req){ data, response, error in
dispatch_async(dispatch_get_main_queue(), {
self.setupTimer()
})
}.resume()
}
}
func setupTimer() {
let timer = NSTimer.scheduledTimerWithTimeInterval(1, target: self, selector: #selector(testc.test), userInfo: nil, repeats: true)
}
}
let theBoy = testc()
theBoy.loop()