2011-08-29 64 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