在swift中使用NSURLSession重用线程

时间:2017-03-28 09:09:31

标签: swift multithreading nsurlsession

我正在编写一个函数(在swift 2中),每隔几秒执行一次HTTP请求。 我正在使用计时器来安排这些请求。

问题是每个请求都使用一个新线程,所以在几分钟后我使用了很多线程(可能是数百个),它们在完成后立即关闭但我更喜欢使用一个线程来完成这项工作。 / p>

功能是:

func getStatus()
{
    let strUrl:String = MY_URL;
    let url = NSURL(string:strUrl);

    let defaultSession = NSURLSession(configuration: NSURLSessionConfiguration.defaultSessionConfiguration(), );
    var dataTask:NSURLSessionDataTask?

    dataTask = defaultSession.dataTaskWithURL(url!)
    {
        data, response, error in
        if let error = error
        {
            print(error.localizedDescription);
        }
        else if let httpresponse = response as? NSHTTPURLResponse
        {
            if httpresponse.statusCode == 200
            {
                self.getDataFromJson(data);
            }
        }
    }
    dataTask?.resume();

    myTimer = NSTimer.scheduledTimerWithTimeInterval(retryInterval,
                                                     target: self,
                                                     selector: #selector(getStatus),
                                                     userInfo: nil,
                                                     repeats: false);
}

正确的方法是什么?

谢谢!

1 个答案:

答案 0 :(得分:0)

我认为最好在数据任务的完成处理程序/关闭中安排新计时器,而不是每次getStatus完成时触发(并且数据任务可能仍在运行)。因此,一次只能运行一个数据任务,例如:

// ...
dataTask = defaultSession.dataTaskWithURL(url!)
{
    data, response, error in
    //... 
    Dispatch.main.async {
        self.myTimer = NSTimer.scheduledTimerWithTimeInterval(retryInterval,
                                                              target: self,
                                                              selector: #selector(getStatus),
                                                              userInfo: nil,
                                                              repeats: false);
    }
}
dataTask?.resume();
// ...

或者您可以使用DispatchQueue.main.asyncAfter(deadline: .now() + retryInterval) { ... }代替计时器。