我正在编写一个函数(在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);
}
正确的方法是什么?
谢谢!
答案 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) { ... }
代替计时器。