2011-08-29 119 views
2

目前我正在对我的应用程序进行简单的测试(用xCode编写的MAC OS X),并且我注意到从互联网获取数据时存在一些问题。所以,我请求一些文本数据:现在如何清除/冲刷NSString的缓存

NSString *dataFromInternet = [[NSString alloc] initWithContentsOfURL:url 
               usedEncoding:&encoding 
                 error:&error]; 

  1. 如果上网工程那么一切都是真棒。

  2. 如果网络断开,然后我在“错误”收到错误但是“dataFromInternet”仍然好像有互联网连接

  3. 如果我请求数据(上面的代码),而互联网中断返回同样的数据和然后再次连接互联网和请求数据,我仍然错误,如果互联网不起作用!

我不明白这种行为和发生了什么。我只能猜测有一些缓存机制,我现在不知道如何解决它。

请解释这个(#2 &#3)奇怪的行为,以及如何解决它。 谢谢。

+0

从互联网下载数据的最佳方式是使用NSURLConnection。 (http://bit.ly/mGXAun) –

+0

我稍后再试,谢谢。 – MeIr

回答

1

好了,以后各地的互联网漫游的某个时候,并试图找到答案,我的问题,这里是我想出了:

NSString *dataFromInternet = [[NSString alloc] initWithContentsOfURL:url 
              usedEncoding:&encoding 
                error:&error]; 

上面的代码似乎使用缓存。为了从互联网上获取数据,并且不要在问题中发布所有问题,您必须使用不同的对象。

NSData* data = [[NSData alloc] initWithContentsOfURL:url options:NSUncachedRead error:&error]; 
NSString *dataFromInternet = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; 

以上示例代码中发生了什么?除非你指定以下内容,否则从互联网获取数据的方式几乎与NSString相同:“options:NSUncachedRead” - 意味着它不会缓存数据并始终读取最新和最大 - 在互联网工作的条件下。

获得数据后,如果需要,可以将其转换为NSString。我需要NSString,所以我将它转换回我想要的。否则,原始帖子中的所有问题都解决了!

我可以在我的Mac上关闭机场,并且不会收到任何数据,只要我打开机场,数据就会再次流动。非常简单,对我很好。

谢谢。

0

所以我无法重现这一点。有了这个代码:

NSError *error = nil; 
NSStringEncoding encoding = 12345678; // known bad value 
NSString *test = [[NSString alloc] initWithContentsOfURL:[NSURL URLWithString:@"http://www.example.com/non-existant-page.html"] usedEncoding:&encoding error:&error]; 
if (test == nil) { 
    NSLog(@"didnt work:%@, enc=%d, error:%@",test, encoding, error); 
} else { 
    NSLog(@"worked:%@, enc=%d, error:%@", test, encoding, error); 
} 

...,没有互联网,我得到这个:

2011-08-28 22:30:45.482 test[48578:207] didnt work:(null), enc=12345678, error:Error Domain=NSCocoaErrorDomain Code=256 "The operation couldn’t be completed. (Cocoa error 256.)" UserInfo=0x5b09280 {NSURL=http://www.example.com/non-existant-page.html} 

我也跑这个后互联网做以确认它没有被缓存(不是),所以我不知道你怎么能得到结果。你能给我们更多你使用的代码吗?

+0

好的,这里有详细的模拟。 1)试图从互联网上获取真实数据(真实链接) 2)不要重新加载应用程序,使用函数创建应用程序来执行操作。 3)程序运行时,打开机场,点击操作(调用方法)。然后关闭机场,然后再次点击该操作。 让我知道那是怎么回事。 – MeIr

+0

即使在模拟器中,我也获得了第一次得到同样的结果。您可能需要发布更多的代码。 – pho0

+1

模拟器???? Ops忘记提及它是Mac OS X应用程序,而不是iPhone。 – MeIr