我有一个http请求,如果我正确收到响应,那么我想启动一个每秒触发一个函数的计时器.该函数也是一个http请求.
这是我启动计时器的代码
if let data = data { do{ let resultJSON = try NSJSONSerialization.JSONObjectWithData(data,options: []) requestClient.id = resultJSON["id"] as! Double self.timerResponse = NSTimer.scheduledTimerWithTimeInterval(1,target: self,selector: "checkIfThereAreResponeses",userInfo: nil,repeats: true) self.timerResponse!.fire() }catch{ } }
如你所见,我正在调用一个名为checkIfThereAreResponses的函数
在该函数中,我有一个print语句,并且该print语句只打印一次,尽管我的计时器应该每1秒工作一次
我有什么遗失?
这就是功能
func checkIfThereAreResponeses(){ if (requestClient!.id != nil) { let url = NSURL(string: "http://localhost:blablabla") let request = NSMutableURLRequest(URL: url) request.HTTPMethod = "POST" let session = NSURLSession.sharedSession() task = session.dataTaskWithRequest(request,completionHandler: {(data,response,error) in if let error = error { print("error = \(error)") } if let data = data { do { let resultJSONArray = try NSJSONSerialization.JSONObjectWithData(data,options: []) as! NSArray bla bla bla }catch { print("no responses yet = \(error)") } } }) task!.resume() }else { print("not yet ") } }
我收到JUST ONCE的印刷品还没有回复
解决方法
如果你在完成处理程序中有这个代码,建议NSTimer在主线程中运行,这可能是原因.您可能需要以下内容:
dispatch_async(dispatch_get_main_queue(),{ // Your timer logic here })
Apple文档说:
Timers work in conjunction with run loops. To use a timer effectively,
you should be aware of how run loops operate—see NSRunLoop.
(NSTimer)
The NSRunLoop class is generally not considered to be thread-safe and
its methods should only be called within the context of the current
thread. You should never try to call the methods of an NSRunLoop
object running in a different thread,as doing so might cause
unexpected results.