定时器vs ASIHTTPRequest – find最佳解决scheme

代码如下所示,一旦你点击一个button,每4秒激活一次定时器和定时器的调用方法。 但是,有时4秒是不够的服务器返回数据。 但是,如果服务器在1秒内返回数据并且不利于用户等待更长时间,则增加计时器值也不是好的解决scheme。 在这种情况下,我不知道什么是最佳/最佳解决scheme。

-(IBAction)play:(id)sender{ timer=[NSTimer scheculedWith TimerInterval(4.0) target:(self)selector:@selector(httpRequest) userinfo:nil repeats:YES] } -(void)httpRequest{ _weak ASIHTTPRequest *request1 = [ASIHTTPRequest requestWithURL:url1]; [request1 setCompletionBlock:^{ NSString *responseString1 = [request1 responseString]; //dispatch_async(backgroundProcess1,^(void){ [self plotOverlay1:responseString1]; //}); }]; [request1 setFailedBlock:^{ NSError *error=[request1 error]; NSLog(@"Error: %@", error.localizedDescription); }]; [request1 startAsynchronous]; } 

如果您只是希望数据不断更新,请考虑从第一个请求的完成块中再次调用-httpRequest (并删除定时器)。 这样,您可以放心,请求会再次执行,但是只有第一个请求结束后 – 您才可以在那里引入延迟,因此您可以得到类似于“第一次检查完成后两秒钟再次检查”的内容。

这可能看起来像这样:

 - (void)httpRequest { __weak ASIHTTPRequest *req = [ASIHTTPRequest requestWithURL:url1]; [req setCompletionBlock:^{ NSString *resp = [req responseString]; [self plotOverlay1:resp]; [self httpRequest]; // or... [self performSelector:@selector(httpRequest) withObject:nil afterDelay:2.0]; }]; /* snip fail block */ [req startAsynchronous]; }