xcode NSURLConnection NSMutableData appendData仅适用于某些类型的内容

时间:2012-06-29 14:42:51

标签: objective-c nsurlconnection

我创建了一个类,用于在iOS-App中获取服务器端数据,基于NSURLConnection,将获取的数据转发给委托进行处理。

下载text / json时效果很好。

我现在正在扩展以获取一些png图像,无法获取数据。

我发现它在didReceiveData调用中断了,其中[receivedData appendData:data]对接收到的图像数据没有任何作用。

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

我将数据输入此方法(NSData> 0字节),但调用[receivedData appendData:data]不会更改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];
}

另一个更新

将问题归结为并发性,因为我同时触发了三个类的实例以异步获取三个文件。问题是,在完成破坏来自其他两个实例的响应时,第一个版本会释放receivedData

如何确保班级的每个实例都有自己的receivedData来玩?


最终笔记 使用MutableArrays的字典来检索并发问题。

似乎将MutableArray定义为类的私有属性为每个实例创建一个数组。

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

2 个答案:

答案 0 :(得分:1)

您是否初始化receivedData

这样的事情可以做到:

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

更快的方法是在您启动实际请求之前对其进行初始化(以便每次收到数据时都不会对其进行检查)。

还要记住,当您的请求完成后,您已完成提取receivedData,以便它可以为下一个请求做好准备。


以下是并发请求的一种解决方案:

创建NSMutableDictionary而不是单个NSMutableData属性,以便您可以一次挂起到多个实例。

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来删除它们。

答案 1 :(得分:0)

我找到了一个可行的解决方法,即将JSON响应中编码的数据base64发送到设备并在设备本地使用文件之前对其进行解码。

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