2012-07-12 109 views
0

好吧,这让我很烦恼。我有以下代码:使用isEqualToString时出现错误访问

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%的时间。我究竟做错了什么?

+1

'viewer.request.URL.relativeString'的值是什么?它被释放了吗?调试器在异常停止时显示什么? – user1118321 2012-07-12 19:14:31

+0

您发布的代码的第一行有错误。尝试通过'NSError * error'而不是'nil'并且尝试传递'NSError * error'而尝试复制/粘贴这个代码,或者你重新键入了它? – 2012-07-12 19:16:21

+0

看看是否有错误返回 – 2012-07-12 19:29:08

回答

1

这个怎么样,假设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)的真实区域中。

相关问题