2012-07-02 74 views
2

附加的問題:接收 現在總數據長度是89973.可是轉換成用下面的代碼的字符串返回一個(空)的字符串。 解決了它:已將編碼更改爲NSASCIIStringEncoding,現在它可以工作。NSURLConnection的不觸發didReceiveData,但返回的數據是零

NSString *responseString = [[NSString alloc] initWithData:receivedData encoding:NSUTF8StringEncoding]; 
NSLog(@"Received string: %@", responseString); 

解決問題: 我試圖登錄到網站,並獲得返回的數據。 一切工作正常,重定向工作就像他們應該。

didReceiveData也被多次調用,但奇怪的是:數據長度爲零。即使我NSLog從didReceiveData內的數據長度。

下面是.m和.h文件以及生成的NSLog信息。

我是Objective-C的新手,我試圖解決這個問題好幾個小時了,但我似乎無法找到原因。

我希望有人可以找我。

這是.m文件

#import "SiteConnection.h" 

@implementation SiteConnection 

@synthesize username; 
@synthesize password; 

// Other 
- (void) printInstanceVars { 

} 

- (void) getInformation { 
    // Enable Network Indicator 
    [[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:YES]; 

    // Set the request URL 
    url = [NSURL URLWithString:@"http://url.com"]; 

    // Create the request using the URL defined above 
    NSMutableURLRequest * request = [NSMutableURLRequest requestWithURL:url]; 

    // Change User-Agent to a Browser 
    [request setValue:@"Mozilla/5.0 (Macintosh; Intel Mac OS X 10.7; rv:13.0) Gecko/20100101 Firefox/13.0.1" forHTTPHeaderField:@"User-Agent"]; 

    // Change method to POST 
    [request setHTTPMethod:@"POST"]; 

    // Create POST string 
    NSString *requestData = [NSString stringWithFormat:@"data=value"]; 

    // Append POST string to the request 
    [request setHTTPBody: [requestData dataUsingEncoding:NSUTF8StringEncoding]]; 

    // Initialize the connection 
    NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:request delegate:self startImmediately:NO]; 

    // Start the connection 
    [connection start]; 
} 

- (NSURLRequest *)connection:(NSURLConnection *)connection 
     willSendRequest:(NSURLRequest *)request 
     redirectResponse:(NSURLResponse *)response 
{ 
    NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *)response; 
    int statusCode = [httpResponse statusCode]; 

    // http statuscodes between 300 & 400 is a redirect ... 
    if (response && statusCode >= 300 && statusCode < 400) { 
     NSLog(@"Redirecting to : %@ (%u)", [request URL], statusCode); 
    } 

    return request; 
} 

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response { 
    [receivedData setLength:0]; 

    NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *)response; 
    NSLog(@"Response: %u (%@)", [httpResponse statusCode], [NSHTTPURLResponse localizedStringForStatusCode:[httpResponse statusCode]]); 
} 

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data { 
    [receivedData appendData:data]; 
    NSLog(@"Receiving data... Length: %d", [receivedData length]); 
} 

- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error { 
    NSLog(@"Error: %@", [error localizedDescription]); 
} 

- (void)connectionDidFinishLoading:(NSURLConnection *)connection { 
    // Hide Network Indicator 
    [[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:NO]; 

    // Display data length 
    NSLog(@"Total received data: %d", [receivedData length]); 

    // Convert data into string and display it 
    NSString *responseString = [[NSString alloc] initWithData:receivedData encoding:NSUTF8StringEncoding]; 
    NSLog(@"Received string: %@", responseString); 
    //NSLog(@"Cookies: %@", [[NSHTTPCookieStorage sharedHTTPCookieStorage] description]); 
} 

這是.h文件

#import <Foundation/Foundation.h> 

@class StatusViewController; 

@interface SiteConnection : NSObject { 
    NSString *username; 
    NSString *password; 
    NSURL *url; 
    NSMutableData *receivedData; 
} 

@property NSString *username; 
@property NSString *password; 

// Other 
- (void) printInstanceVars; 
- (void) getInformation; 

@end 

這是造成的NSLog:

2012-07-02 15:41:12.578 Vodafone[25051:11303] Response: 200 (no error) 
2012-07-02 15:41:12.578 Vodafone[25051:11303] Receiving data... Length: 0 
2012-07-02 15:41:12.580 Vodafone[25051:11303] Receiving data... Length: 0 
2012-07-02 15:41:12.580 Vodafone[25051:11303] Receiving data... Length: 0 
2012-07-02 15:41:12.582 Vodafone[25051:11303] Receiving data... Length: 0 
2012-07-02 15:41:12.583 Vodafone[25051:11303] Receiving data... Length: 0 
2012-07-02 15:41:12.585 Vodafone[25051:11303] Receiving data... Length: 0 
2012-07-02 15:41:12.586 Vodafone[25051:11303] Receiving data... Length: 0 
2012-07-02 15:41:12.587 Vodafone[25051:11303] Receiving data... Length: 0 
2012-07-02 15:41:12.590 Vodafone[25051:11303] Receiving data... Length: 0 
2012-07-02 15:41:12.590 Vodafone[25051:11303] Receiving data... Length: 0 
2012-07-02 15:41:12.591 Vodafone[25051:11303] Receiving data... Length: 0 
2012-07-02 15:41:12.592 Vodafone[25051:11303] Receiving data... Length: 0 
2012-07-02 15:41:12.596 Vodafone[25051:11303] Receiving data... Length: 0 
2012-07-02 15:41:12.601 Vodafone[25051:11303] Receiving data... Length: 0 
2012-07-02 15:41:12.605 Vodafone[25051:11303] Receiving data... Length: 0 
2012-07-02 15:41:12.608 Vodafone[25051:11303] Receiving data... Length: 0 
2012-07-02 15:41:12.608 Vodafone[25051:11303] Total received data: 0 
2012-07-02 15:41:12.608 Vodafone[25051:11303] Received string: 

回答

0

這樣做:

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data { 
    if (!receivedData) 
    { 
     receivedData = [NSMutableData data]; 
    } 

    [receivedData appendData:data]; 

    NSLog(@"Receiving data... Length: %d", [receivedData length]); 
} 
+0

爲什麼 「其他」 appendData ...?你只是放鬆第一幀。 只是如果並追加所有案例,而不是如果/其他 –

+1

我是多麼愚蠢......閱讀你的答案讓我想:當然,是的。 非常感謝!現在解決我的下一個問題。 – Werner

+0

luxsyher你知道receivedData是可變數據 –

0

看起來你已經忘了:

NSMutableData *receivedData = [[NSMutableData alloc] init]; 
0

它在我看來像你永遠不會初始化receivedData。所以你把你接收到的數據附加到一個無效的指針上,它顯然沒有任何作用;-) 在使用它之前,請嘗試類似receivedData = [[NSMutableData alloc] init];的東西。

相關問題