2011-05-19 29 views
-2

我確實有一個包含流的數據的url。如何發送請求到url並獲取數據到字符串

我需要將數據加載到NSString中。

@all

幫我一把。

+2

你有沒有試過_anything?_ – 2011-05-19 14:00:34

+1

和Matt Ball不是。那是我這個小時的任務。 – 2011-05-19 14:01:50

+2

那麼,當你這樣做時,回來告訴我們你試過了什麼,什麼不適合你。 – Abizern 2011-05-19 14:03:28

回答

1
NSData *data = [NSData dataWithContentsOfURL:myURL]; 
NSString *myString = [[NSString alloc] initWithData:data 
              encoding:NSUTF8StringEncoding]; 

你必須知道編碼才能做到這一點。

3

有幾種方法可以解決這個問題,每個方法都取決於你的情況。第一種方法是使用NSString的+ (id)stringWithContentsOfURL:(NSURL *)url encoding:(NSStringEncoding)enc error:(NSError **)error方法。所以,如果你想獲得一些URL的內容,你可以使用下面的代碼

NSURL* url = [NSURL urlWithString:@"http://www.someUrl.com/some/path"]; 
NSString* urlContents = [NSString stringWithContentsOfURL:url encoding:NSUTF8Encoding error:nil]; 

問題這種方法是,它會阻止你把那個叫什麼上線。所以你可以在一個線程中調用它或使用其他方法之一。

第二種方法是使用NSURLConnection。這使用委託來以事件驅動的方式處理過程。有一個很好的總結方法here

第三種方法是使用某種封裝類來處理更高級別的http請求。我個人喜歡ASIHTTPRequest。它可以處理請求同步,使用委託異步和異步使用塊。以下示例來自ASIHTTPRequest website。此示例顯示如何執行異步HTTP請求。

- (IBAction)grabURLInBackground:(id)sender 
{ 
    NSURL *url = [NSURL URLWithString:@"http://allseeing-i.com"]; 
    ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url]; 
    [request setDelegate:self]; 
    [request startAsynchronous]; 
} 

- (void)requestFinished:(ASIHTTPRequest *)request 
{ 
    // Use when fetching text data 
    NSString *responseString = [request responseString]; 

    // Use when fetching binary data 
    NSData *responseData = [request responseData]; 
} 

- (void)requestFailed:(ASIHTTPRequest *)request 
{ 
    NSError *error = [request error]; 
} 

本示例說明如何使用塊作爲委託方法的回調intsead執行異步請求。請注意,這隻能在iOS 4.0及更高版本中使用,因爲它使用了塊。但是ASIHTTPRequest通常可以在iOS 3.0及更高版本上使用,無需使用塊。

- (IBAction)grabURLInBackground:(id)sender 
{ 
    NSURL *url = [NSURL URLWithString:@"http://allseeing-i.com"]; 
    __block ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url]; 
    [request setCompletionBlock:^{ 
     // Use when fetching text data 
     NSString *responseString = [request responseString]; 

     // Use when fetching binary data 
     NSData *responseData = [request responseData]; 
    }]; 
    [request setFailedBlock:^{ 
     NSError *error = [request error]; 
    }]; 
    [request startAsynchronous]; 
} 
+0

對於沒有upvotes的封閉問題這麼長的迴應:(如果你計劃改變這個值,你只需要聲明一個變量爲'__block',那麼它肯定會在沒有__block'的情況下存在readonly 。 – Joe 2011-05-19 14:26:15

+0

@Joe:在這種情況下,這是爲了避免保留策略 – 2011-05-19 14:33:43

+0

@Nikolai:你可以解釋一下嗎? – Joe 2011-05-19 14:35:09

-2

好吧,你不得不制定出如何到它是兼容的等效字符串表示對每個字節進行編碼。在.Net中,我們使用Base64編碼。我確定在iWorld中有一些相同的東西。

相關問題