2013-02-28 28 views
0

我有一個奇怪的問題,從api讀取響應。在connectionDidFinishLoading中,將響應記錄爲字符串[NSString stringWithUTF8String:[self.response bytes]]時,該字符串有時會被正確記錄,有時爲空,而其他時間是在末尾附加隨機字符的正確響應。Xcode NSURLConnection NSMutableData appdendData有時只能起作用

在didReceiveData中,響應很好,但是在使用appendData之後發生問題。在didReceiveData我可以說明這樣的問題:

// This is always 0 
NSLog(@"data length is %i", [data length]); 
// This is always the correct response string sent from the api 
NSLog(@"data string is %@", [NSString stringWithUTF8String:[data bytes]]); 

NSMutableData *foo = [[NSMutableData alloc] init]; 
[foo appendData:data]; 

// This is always 8 
NSLog(@"foo length is %i", [foo length]); 
// This is only sometimes the correct response string! 
NSLog(@"foo string is %@", [NSString stringWithUTF8String:[foo bytes]]); 

[foo release]; 
foo = nil; 

我已經看到了SO約類似瘋狂的問題appendData一對夫婦的其他問題,但他們似乎已經因爲變量被追加到幾乎等於零。這表明我已經清楚地聲明瞭我的NSMutableData foo,但它仍然沒有正確設置。

+2

stringWithUTF8String將假定字節在utf8中。這可能無法給出正確的結果。費邊克雷澤的答案是更好的方法。 – Mohammad 2013-02-28 07:13:30

回答

2

請發佈整個代碼,而不僅僅是這個簡短的摘錄。

我假設你正在重新分配一個新的NSMutableData實例每次-connection:didReceiveData:被調用。您需要使用屬性或iVar,以便在調用-connection:didReceiveData:後續時間時將數據附加到已存在的數據。

- (void)startConnection 
{ 
    self.receivedData = [[NSMutableData alloc] init]; 
    // Start connection... 
} 

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data 
{ 
    [self.receivedData appendData:data]; 
} 

- (void)connectionDidFinishLoading:(NSURLConnection *) 
{ 
    NSString *receivedString = [[NSString alloc] initWithData:self.receivedData encoding:NSUTF8StringEncoding]; 
    self.receivedData = nil; 

    NSLog(@"Response: %@", receivedString); 
} 
+0

不好意思,縮小範圍會有幫助。我的方法轉換爲字符串是問題,你的問題已經修復。 – 2013-02-28 07:33:17

+0

所以對於後代,用這個'[[NSString alloc] initWithData:self.receivedData encoding:NSUTF8StringEncoding]''不要用這個'[NSString stringWithUTF8String:[self.receivedData bytes]]'從數據中獲取字符串'。謝謝! – 2013-02-28 07:43:30