好吧,这很烦我。我有以下代码:
weatherAddress = [NSString stringWithFormat:@"http://google.com"];
weatherUrl = [NSURL URLWithString:weatherAddress];
weatherContents = [NSString stringWithContentsOfURL:weatherUrl encoding:NSASCIIStringEncoding error:nil];
if ([viewer.request.URL.relativeString isEqualToString:weatherContents]) {
//do stuff
}
但是当它运行时,有时会引发错误的访问。当我说有时候时,我通常指的是50%的时间。我究竟做错了什么?
最佳答案
假设在类中定义了weatherContents,该如何做:
weatherAddress = [NSString stringWithFormat:@"http://google.com"];
weatherUrl = [NSURL URLWithString:weatherAddress];
weatherContents = [NSString stringWithContentsOfURL:weatherUrl encoding:NSASCIIStringEncoding error:nil];
[NSTimer scheduledTimerWithTimeInterval:0.5 target:self selector:@selector(checkIfWeatherReceived) userInfo:nil repeats:NO];
然后创建一个名为
checkIfWeatherReceived
的方法,如下所示:-(void) checkIfWeatherReceived
{
if(weatherContents)
{
if ([viewer.request.URL.relativeString isEqualToString:weatherContents]) {
//do stuff
}
} else {
[NSTimer scheduledTimerWithTimeInterval:0.5 target:self selector:@selector(checkIfWeatherReceived) userInfo:nil repeats:NO];
}
}
我真的不喜欢使用会在连接断开时锁定界面的内容,因此我将避免“等待”。这将每半秒检查一次是否已获取天气数据。如果您希望它检查得更快,只需更改TimeInterval。如果您发现数据没有太多延迟,则可能希望它真的非常快,例如.01。您还应该考虑如果连接断开并且您永远都无法获取数据,除非您已经考虑了这一点,否则会发生什么情况。我还没有测试过,但是我认为应该可以解决,假设您所有的内容都是该类的一部分,而不是局部于某个方法。我可能还会将实际工作从
checkIfWeatherReceived
分解为另一种方法,而不是仅仅将其放置在if(weatherContents)
true区域中。