2012-06-29 61 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数据编码并在设备上本地使用文件之前将其解码。

这也证明相当有用,因为它可以在一个请求中传输所需的三个文件。

相关问题