2012-06-29 63 views
0

我已經創建了一個類,用於在基於NSURLConnection的iOS-App中獲取服務器端數據,將獲取的數據轉發給委託進行處理。xcode NSURLConnection NSMutableData appendData僅適用於某些類型的內容

當下載文本/ JSON這個完美的作品。

我現在正在擴展獲取一些PNG圖像,無法獲取數據。

我發現它在didReceiveData-call中斷,其中[receivedData appendData:data]對接收到的圖像數據不做任何處理。

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data 
{ 
    // Append the new data to receivedData. 
    [receivedData appendData:data]; 
} 

我得到數據到這個方法(NSData的> 0字節),但調用[receivedData appendData:數據]不改變receivedData(靜像0字節)的大小。

由於這與文本完美配合,而不是與圖像數據相關,我認爲它與字符集或編碼有關,但無法在其上找到任何內容。

任何幫助表示讚賞。


更新與請求的代碼樣本:

在使呼叫的方法:

NSURLConnection *theConnection=[[NSURLConnection alloc] initWithRequest:theRequest delegate:self]; 
if (theConnection) { 
    // Create the NSMutableData to hold the received data. 
    receivedData = [NSMutableData data]; 
    // Also tried with no change in behaviour 
    // receivedData = [[NSMutableData alloc] initWithLength:0]; 
} else { 
    // Inform the user that the connection failed. 
} 

didReceiveResponse

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

另一個更新

原來,問題BOIS下來併發我火類的三個實例同時放至asynchroniously取三個文件。問題是第一個版本receivedData在完成破壞來自其他兩個實例的響應時。

如何確保每個課程實例都有自己的receivedData玩?


最後說明 使用MutableArrays爲retreived數據的詞典解決併發問題。

它也好像定義MutableArray作爲類的私有屬性爲每個實例創建一個數組。

@interface MyClass(){ 
    @private NSMutableData * receivedData; 
} 
+2

我想'receivedData'只是'nil'。 – omz

+0

Plz向我們展示您的應用程序中的「 - (void)連接:(NSURLConnection *)連接didReceiveResponse:(NSURLResponse *)響應 」方法。 –

+0

'連接didReceiveResponse'只需調用'[receivedData setLength:0]' – mariusnn

回答

1

你有沒有初始化receivedData

像這樣的事情會做到這一點:

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

更快的方法是你踢右關前的實際要求(因此,它不是被檢查每次接收數據)進行初始化。

還記得當你的請求完成並且你已經完成提取以便它將準備好去下一個請求時receivedData


下面是併發請求一個解決辦法:

而不是一個單一的NSMutableData屬性,創建一個NSMutableDictionary,這樣就可以同時掛在多個實例。現在

NSMutableDictionary *receivedData

,一旦你整理了一下NSURLConnection的(姑且稱之爲urlConnection),你可以創建一個新的獨特的數據對象,並把它放在你的字典。您應該能夠使用連接的字符串描述作爲唯一密鑰。

if(!receivedData) 
    receivedData = [NSMutableDictionary dictionary]; 

NSMutableData *dataObject = [NSMutableData data]; 
[receivedData setObject:dataObject forKey:[urlConnection description]]; 

現在你可以這樣做:

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data 
{ 
    NSMutableData *currentData = (NSMutableData*)[receivedData objectForKey:[connection description]]; 
    [currentData.appendData:data]; 
} 

一旦連接完成後,記得打電話removeObjectForKey擺脫數據對象,一旦他們不再需要。

+0

就可以重置receivedData。它在代碼中被進一步初始化,並且在添加數據之前被設置。 – mariusnn

+0

對問題運行更詳細的分析後,問題似乎是併發性和靜態(每類)receivedData。 由於該過程觸發了三個文件下載實例以獲得三個文件,第一個完成的第一個實例設置了「receivedData = nil」進行清理,然後完成清理。 – mariusnn

+0

所以我想問題是:我如何確保'receivedData'對於我的responseClass的每個實例保持不同? – mariusnn

0

我發現了一個可行的解決方法,它將發送到設備的JSON響應中的base64數據編碼並在設備上本地使用文件之前將其解碼。

這也證明相當有用,因爲它可以在一個請求中傳輸所需的三個文件。

相關問題