好吧,这很烦我。我有以下代码:

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区域中。

10-08 00:25