我对目标C非常陌生。我有一个案例,我需要定期向服务器URL发送请求。我建立了一个异步URL连接,并使用NSTimer函数调用viewWillAppear函数。
- (void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"myurl/test.csv"] cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:15.0];
NSURLConnection *connection= [[NSURLConnection alloc] initWithRequest:request delegate:self];
if(connection){
label.text = @"connecting...";
}else{
//
}
}
-(void)connection :(NSURLConnection *) connection didReceiveData:(NSData *)data{
[self viewWillAppear:TRUE];
response = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
NSLog(response);
}
我使用以下NSTimer方法调用viewWillAppear方法。
- (void)checkURLRequest
{
[self setProgressTimer:[NSTimer
scheduledTimerWithTimeInterval:(1.0f / 30.0f)
target:self
selector:@selector(viewWillAppear:)
userInfo:self
repeats:TRUE]];
}
- (void)setProgressTimer:(NSTimer *)theTimer
{
[_progressTimer invalidate];
_progressTimer = theTimer;
}
我的方法是否正确?因为当我更新文件' test.csv'在服务器上,当文件更改其仍然记录文件中的旧值时,它无法进行实时更新。
答案 0 :(得分:2)
你不应该自己打电话给viewWillAppear:
,特别是因为它需要拨打[super viewWillAppear:]
来做你不了解的事情。我可以从经验中告诉你,自己调用这些视图控制器方法会导致很难调试的奇怪错误。
因此,请将您的网址连接处理代码移到您使用计时器调用的单独方法中,如果需要,还可以在viewWillAppear:
中调用。
答案 1 :(得分:1)
这不是正确的方法,实际上你永远不应该调用那些viewcontroller回调方法,比如viewWillAppear。我不确定viewWillAppear上正在执行什么代码,但正确的方法是将代码移动到另一个方法并调用该方法。
答案 2 :(得分:1)
我会将所有的URL连接内容移到VC外部,并转移到使用块执行此操作的自定义类中。这将允许您在其他类中使用它,并且是更好的OO编程。如果您需要,我可以向您发送一个我用于图像加载的示例。