Swift中嵌套的异步代码块

时间:2016-10-11 16:49:30

标签: ios swift asynchronous concurrency

我试图在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

1 个答案:

答案 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()